[英]Getting an infinite loop in Babylonian Algorithm for square roots in C++
[英]Generalizng the Babylonian Square Root Algorithm to nth roots
我一直在尋找根算法,並遇到了巴比倫算法。 我非常喜歡它,因為它簡單易懂。 但問題是它只需要平方根,當我正在創建一個能夠以任何權力取得數字根的函數時。 我只是嘗試采取正整數。
這是功能:
double functions::rot(double x, double y) {
double z = x;
double w = 1;
double e = 0.000001;
while (z - w > e){
z = (z + w) / 2;
w = x / z;
}
return z;
}
y就是力量。 有沒有人有辦法改變這個算法,所以y是根的力量? 例如,如果y = 3,則采用立方根。
將w = x / z
更改為w = x / z*z
的注釋僅為1/3
(雙關語意)正確。 您還需要另外兩個更改,我認為這些更改在此Python代碼中很明顯:
def rot(x, y): #
z = x
w = 1
e = 0.000001
while (z - w > e):
z = ((y - 1) * z + w) / y
w = x / (z ** (y - 1)) # a ** b is a to the power of b in Python
# you might want to use modular exponentiation in C++
# (or not if y is double...)
return z
print(rot(64, 3)) # prints 4
print(rot(59, 6)) # prints 1.9730678338673044
請參閱此處以供參考 。 我建議你閱讀它,因為它提供了更深入的解釋。
牛頓的方法類似於巴比倫方法,可用於提取任何能量的根。 我們假設k ,根和輸入的n都是正整數; u的賦值中的兩個除法都是整數除法(忽略余數):
function iroot(k, n)
k1, u, s := k-1, n, n+1
while u < s
u := (u * k1 + n / (u ** k1)) / k
s := u
return s
警告:未經測試的偽代碼。 函數iroot
在自身乘以k次時返回不超過n的最大整數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.