2010-07-07 18 views
7

Ben bignums için uzun bölünme uygulamaya çalışıyorum. Ne yazık ki gömülü programlamanın kısıtlamaları nedeniyle GMP gibi bir kütüphaneyi kullanamıyorum. Ayrıca, nasıl uygulanacağını öğrenmenin entelektüel kullanımını istiyorum. Şimdiye kadar, herhangi bir uzunluktaki bayt dizileri kullanılarak yapılan ekleme ve çarpma işlemlerine sahibim (böylece her bayt bir taban-256 basamağı gibidir).Muazzam sayılar (bignums) için uzun bölünme nasıl uygulanır

Sadece bölüm/modül uygulamalarına başlamaya çalışıyorum ve nereden başlayacağımı bilmek istiyorum. Ağda yüksek düzeyde optimize edilmiş (aka okunamayan) bir çok kod buldum, bu bana yardımcı olmuyor ve teori ile uygulama arasındaki boşluğu dolduramadığım bir çok teknik matematiksel çok sayıda grafik buldum. . Birisi popüler bir algoritma önerebilirse ve bunu anlamsızlaştırmaya yönelten bir açıklamayı anlatabilirse, bu harika olur.

-düzenleme: Ben temettü olduğunda algoritmalar hangi işi gerek ~ 4000bits ve bölen 2000bits

-düzenleme ~ geçerli: Baz-256 ile Will bu algoritma çalışır? http://courses.cs.vt.edu/~cs1104/BuildingBlocks/divide.030.html

-edit: Bu gerçekten kullanmam gereken algoritma mı (newton division)? http://en.wikipedia.org/wiki/Division_(digital)#Newton.E2.80.93Raphson_division

+0

Bu, ama ben> 2048 bit sayısı için iyi bir algoritma olacağından emin değilim? http://stackoverflow.com/questions/2525172/custom-very-long-int-division-issue – Chris

+1

Ayrıca bu makaleyi de buldum, başlamam için iyi bir algoritma olabilir mi? Knuth referansı için http://www.brinch-hansen.net/papers/1994b.pdf – Chris

cevap

4

Öğrenmek isterseniz, ilkokulda kullandığınız kalem ve kağıt yöntemiyle başlayın. İster inanın ister inanmayın, bu aslında aradığınız aralıktaki sayılar için çoğu bignum kütüphanesinde kullanılan aynı O (n^2) algoritmasıdır. Zorlu ilk adım “bölüm tahmini” olarak adlandırılır ve bu muhtemelen anlaşılması en zor olanı olacaktır. Bunu anladıktan sonra, gerisi kolay gelmeli.

İyi bir referans Knuth'un "Seminumerical Algorithms" dir. Hem metin hem de alıştırmalarda bölüm kestirimi yapmanın farklı yolları hakkında birçok tartışması vardır. Bu kitabın, bignum uygulamalarına ayrılmış bölümleri var.

+0

+1. –

+0

Kalem ve kağıt yöntemi yalnızca, bölme birimi bir veya iki basamak uzunsa, net – Chris

+0

Askıda bulabildiğimden işe yarayacak gibi görünüyor, bu burada kaydırma/çıkarma yöntemi ile aynı mı? http://courses.cs.vt.edu/~cs1104/BuildingBlocks/divide.030.html – Chris

0

Bu soru 2 yaşın üzerindedir, ancak bu boyut numaraları için OpenSSL kaynak koduna bakabilirsiniz. Bu boyut numaralarıyla RSA yapar, böylece 1000 ila 4000 bit sayıları için optimize edilmiş birçok matematik rutini vardır.

1

Kodunuzda boşluk Four1 (uzun çift [], int, int) kullanıyorsunuz ve sonra da tersine çeviriyorsunuz ve ters bir dönüşüm yapıyordum. Çalışmaya çoğalttım ama bölme işlemini yapmaya çalıştığımda aynı şekilde tükürdü bir sonuç çıktıktan sonra yardım edemem ama eğer "C++ 'da Numerik Tarifler" denilen bir araca sahipseniz, sonuna yakın bir yere gidin ve aslında aradığınızı bulacaksınız. Aslında bu sayfa 916'dan 926'ya başlıyor.