Rasgele hassas tamsayı karekök algoritması?


9

Bir nbit tamsayısının kare kökünün tabanını hesaplamak için bilinen herhangi bir alt-ikinci algoritma var mı?

Saf algoritma şöyle bir şey olurdu

def sqrt(x):
    r = 0
    i = x.bit_length() // 2
    while i >= 0:
        inc = (r << (i+1)) + (1 << (i*2))
        if inc <= x:
            x -= inc
            r += 1 << i
        i -= 1
    return r

Bu O(n), her biri O(n)zaman olan eklemeler içeren iterasyonlar gerektirir , bu yüzden O(n^2)genel olarak zaman. Daha hızlı bir şey var mı? Çarpma durumunda, ikinci dereceden daha iyi olan özel algoritmalar olduğunu biliyorum, ancak kare kökler için hiçbir şey bulamıyorum.


İlgili bir şeye cevabım cs.stackexchange.com/a/37338/12052 adresine yardımcı olabilir . Tek sorun, doğruluğunu değiştirmek için ampirik olarak bulmanız gereken gerekli denklemin bir parçasıdır.
Francesco Gramano

@FrancescoGramano: Üzgünüm, bunun yardımcı olduğunu düşünmüyorum.
Aryabhata

btw, bu ikinci dereceden gereksinim daha büyük bir sorunun parçası mı? Çünkü basit kuadratik ve karmaşık alt kuadratik arasındaki fark pratikte o kadar büyük olmayabilir. Yoksa sadece teorik ilgi mi?
Aryabhata

@Aryabhata Üzgünüm yorumunuzu daha önce görmedim. Hayır, daha büyük bir sorunun parçası değil, sadece merak.
Antimon

Yanıtlar:


5

Polinomun köklerine yaklaşım bulmak için Newton yöntemini veya diğer yöntemlerden herhangi birini kullanabilirsinizp(x)=x2c.

Newton yöntemi için yakınsama oranı ikinci dereceden olacaktır, yani doğru olan bit sayısı her yinelemede iki katına çıkar. Bunun anlamıO(lgn) Newton yönteminin yinelemeleri yeterlidir.

Newton yönteminin her yinelemesi hesaplanır

xj+1=xj(xj2c)/(2xj)=0.5xj+c2xj.

Çarpmanın bit karmaşıklığı O (blgb), iki ile çarpmak bbit tamsayıları (yoksayılıyor) lglgbfaktörler). Bölme için bit karmaşıklığı (bkesinlik) aynıdır. Bu nedenle, her bir yinelemeO (nlgn)operasyonlar. İle çarpmaO(lgn) yinelemeler, karekök hesaplamak için toplam çalışma süresinin n hassasiyet parçaları O (n(lgn)2). Bu ikinci dereceden.

Bence daha dikkatli bir analiz bunun geliştirilebileceğini gösteriyor O (nlgn) çalışma süresi (yalnızca her birini bilmemiz gerektiğini dikkate alarak) xj hakkında j doğruluk parçaları nhassasiyet bitleri). Bununla birlikte, daha temel analizler bile, açıkça subadratik olan bir çalışma süresini göstermektedir.


İkili olarak da kimliğini kullanarak büyük bir ilk tahmin x1/2=21/2log2x. Günlüğü hesaplamak yerine, yaklaşık olaraklog2x içindeki basamak sayısı olarak x. Örneğin,log21010116.
Nick Alger

@DW: Ama tamsayı bir karekök armıyor muyuz? Newton'un yöntem yinelemesini yalnızca tamsayı aritmetiği kullanarak yaparsanız,O(logn)iddia, değil mi? Aksi takdirde, zaten yeterince büyük bir hassasiyet varsayıyoruz ... Bariz bir şeyi kaçırırsam özür dilerim.
Aryabhata

@DW: "Newton'un yöntemi için yakınsama oranı" şu durumlarda ikinci dereceden olmaz c=0ve değerleri için ne olduğunu bilmiyorum c bu negatif olmayan gerçekler değildir. Çarpmanın biraz karmaşıklığına ilişkin tahmininiz , aşağıdaki açıklamanızın önerdiğinden daha sıkıdır . Ayrıca, her birini xj içinde " 2j msgstr "kesinlik parçaları".

@Aryabhata: Tam olarak "tamsayı bir kare kök arıyoruz"; "karekökün zemini" arıyoruz. Aynı bit karmaşıklıkları kayan nokta işlemleri için geçerli olsa da, tamsayı aritmetik konusunda haklısınız.

1
@RickyDemer, evet, c=0 özel bir durumdur, çünkü o zaman p(x) çokluk 2, ama ne zaman c>0Newton yöntemi, böylece kök çokluğu 1 sahiptir gelmez kuadratik yakınlaşma var. Kimsenin Newton'un yöntemini kare kökünü hesaplamak için kullanmayacağını varsayıyorum.c=0(çünkü sıfırın kare kökü açıkça sıfırdır). Ne demeye çalışıyorsun? Yorumunuz, cevabıma "özel durum sıfırın kare kökü" yazan bir şey ekleyerek ele alınan önemsiz bir yorum mu yoksa eksik olduğum daha derin bir şey var mı?
DW

7

Newton yöntemiyle ilgili sorunlardan biri, her yinelemede en yavaş temel tamsayı işlemi olan bir bölme işlemi gerektirmesidir.

Ancak Newton'un karşılıklı karekökü yöntemi böyle değildir. Eğerx bulmak istediğiniz sayıdır 1x, yineleme:

ri+1=12ri(3xri2)

Bu genellikle şu şekilde ifade edilir:

wi=ri2
di=1wix
ri+1=ri+ridi2

Bu üç çarpma işlemi. İkiye bölünme, bir vardiya hakkı olarak uygulanabilir.

Şimdi sorun şu ki rbir tamsayı değil. Bununla birlikte, kayan noktayı manuel olarak uygulayarak ve uygun olduğunda telafi etmek için bir sürü kaydırma işlemi yaparak bu şekilde değiştirebilirsiniz.

İlk olarak, yeniden ölçeklendirelim x:

x=22ex

nerede isteriz x daha büyük, ancak 1. Yukarıdaki algoritmayı çalıştırırsakx onun yerine x, bulduk r=1x. Sonra,x=2erx.

Şimdi ayrılalım r bir mantis ve üs içine:

ri=2eiri

nerede ribir tamsayıdır. sezgisel,ei cevabın kesinliğini temsil eder.

Newton yönteminin doğru anlamlı basamak sayısını kabaca iki katına çıkardığını biliyoruz. Böylece seçebiliriz:

ei+1=2ei

Biraz manipülasyon ile buluyoruz:

ei+1=2ei
wi=ri2
xi=x22eei+1
di=2ei+1wixi2ei+1
ri+1=2eiriridi2ei+1

Her yinelemede:

xrix2e+ei

Örnek olarak, kare kökünü hesaplamayı deneyelim. x=263. Cevabın2312. Karşılıklı karekök12231, bu yüzden e=31 (bu sorunun ölçeğidir) ve ilk tahminimiz için r0=3 ve e0=2. (Yani, biz seçeriz34 ilk tahminimiz için 12.)

Sonra:

e1=4,r1=11
e2=8,r2=180
e3=16,r3=46338
e4=32,r4=3037000481

Karşılaştırma yaparak yinelemeyi ne zaman durduracağımızı hesaplayabiliriz ei to e; if I've calculated correctly, ei>2e should be good enough. We'll stop here, though, and find:

2633037000481×263231+32=3037000481

The correct integer square root is 3037000499, so we're pretty close. We could do another iteration, or do an optimised final iteration which doesn't double ei. The details are left as an exercise.

To analyse the complexity of this method, note that multiplying two b-bit integers takes O(blogb) operations. However, we have arranged things so that ri<2ei. So the multiplication to calculate wi multiplies two ei-bit numbers to produce a ei+1-bit number, and the other two multiplications multiply two ei+1-bit numbers to produce a 2ei+1-bit number.

In each case, the number of operations per iteration is O(eilogei), and there are O(loge) iterations required. The final multiplication is on the order of O(2elog2e) operations. So the overall complexity is O(elog2e) operations, which is sub-quadratic in the number of bits in x. That ticks all the boxes.

However, this analysis hides an important principle which everyone working with large integers should keep in mind: because multiplication is superlinear in the number of bits, any multiplication operations should only be performed on integers which have the roughly the magnitude of the current precision (and, I might add, you should try to multiply numbers together which have a similar order of magnitude). Using integers larger than that is a waste of effort. Constant factors matter, and for large integers, they matter a lot.

As a final observation, two of the multiplications are of the form ab2c. Clearly it's wasteful to compute the all the bits of ab only to throw c of them away with a right-shift. Implementing a smart multiplication method which takes this into account is also left as an exercise.


This is great stuff. One comment, though: Isn't the bit-complexity of division asymptotically approximately the same as the bit-complexity of multiplication? So you're talking about something that gives a constant factor improvement, not an asymptotic improvement, right? That wasn't entirely clear from your answer.
D.W.

You say that multiplying two b-bit integers takes O(blgb) bit operations. I think the correct answer is something like O(blgb(lglgb)O(1)) (right?). You might want to indicate that you are ignoring poly-log-log factors (e.g., by putting a tilde over your big O, or something).
D.W.

1
@D.W. : No, he says that "multiplying two b-bit integers takes O(blogb) operations." The word "bit" only appears once in that; otherwise I would've already pointed that out.

It is a matter of constant factors, yes. The best large integer division algorithms use a technique very similar to the whole algorithm, such as Newton-Raphson iteration and doubling the effective precision on each iteration. A Newton-Raphson loop within a Newton-Raphson loop piles on the constant factors! Ricky Demer is correct; I was thinking in the word RAM model. I probably should have mentioned this.
Pseudonym
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.