[心得] 直式开方法

楼主: jurian0101 (Hysterisis)   2013-07-04 22:44:37
Knuth说,自己已经学会某事情的一种证明是:教会你的电脑。
今天学会了脱胎自 (10a+b)^3 = 1000a^3 + 300 a^2 b + 30a b^2 + b^3 公式
和直式开平方法的直式开立方法
source= http://chowkafat.net/Abacus8.html
其实这个方法很烂,因为相较于开平方时左手边栏是每次增加一位数,
而开立方时,不仅步骤多,而且估计下一位更难,更糟糕的是左手边的位数以每次
两位增加。
所以用手算除了要很大一张纸和大量的细心,甚至效率不比简单的牛顿法好。
总之为了纪念学过,就有点多此一举的把这又点复杂的算法编成MMA代码吧 (做为练习XD
直式开方[x_Integer, precision_Integer] :=
Module[{rL, r, a, b, col, ans, idx = precision, point},
rL = IntegerDigits[x, 1000]; (*每3位一组*)
ans = (a = Floor[rL[[1]]^(1/3)]);
rL[[1]] = rL[[1]] - a^3;
col = {300 a^2, 30 a, 1};
idx -= 1; (*算几次后停止*)
point = 1; (*记录小数点以上有几位*)
(*若精准度足够则跳出,ans=a *)
While[idx > 0,
r = rL[[1]]*1000 + rL[[2]];
b = Floor[r/col[[1]]];
While[r < col.{b, b^2, b^3}, b -= 1]; (*决定b*)
If[Length@rL > 2,
rL = {r - col.{b, b^2, b^3}}~Join~rL[[3 ;;]]; (*清单向右缩短*)
point += 1, (*是小数点以上*)
rL = {r - col.{b, b^2, b^3}, 0} (*小数点以下的补0*)
];
idx -= 1;
ans = 10*ans + b;
col = {300 ans^2, 30 ans, 1}(*更新col*)
];
(*输出*)N[ans/10^(precision - point - 1), precision]
]
测试:
352^3=43614208, 直式开方[43614208, 3]= 352.
直式开方[43614207, 20] = 351.99999730974515850
N[43614207^(1/3), 20] = 351.99999730974515850
= = =
ps. 后记
会去研究怎么算其实是被明代朱载堉(1530-1610)这个奇才刺激到了
这位超牛的王子是“十二平均律”的最早发明+实现者,正是这个原因他用算盘
将2开了12次方,求到小数点以下25位精确值! 当时欧洲的数学家还算得2266误差百出呢。
可想见要不就是直接解x^12-2=0的牛顿法 (牛顿还没出生咧),
或是开两次平方再一次立方。除此之外我列不出其他方法能算到25位XD
接近接近2^(1/12)的分数中分母最小的是
FromContinuedFraction@ContinuedFraction[2^(1/12), 28]=
7147579272248/6746416472931
N[7147579272248/6746416472931,25]=1.059463094359295264561825
而这个结果朱载堉在四百年前就算出来了
http://zh.wikipedia.org/wiki/File:%E4%B9%90%E5%BE%8B%E5%85%A8%E4%B9%A6%E5%85%A8-123.jpg
= = =
pps. 列入金氏世界纪录的一项心算挑战是 13th root of 100/200-digit number
这位超能逆天的法国人Alexis Lemaire成功在70秒内
算出 200位数
9147439234287241692920723809496000857331422592710260318167504650965532\
9359229555248436073522547285876508820526837505708703326135976287791083\
873682599348132022020213082392767546685090283520000000000000
的十三次方根
= 2407899883032220^13
source= http://tech.sina.com.cn/d/2007-12-12/10121907975.shtml
嗯,大家应该有注意到他运气很好,挑战当时电脑正好选到0结尾的数,瞬间少算一位。
13次方后刚好两百位数的数有
Floor[10^(200/13)] - Floor[10^(199/13)] = 393 544 396 177 593 个 @@
刚好选到0结尾则只有十分之一的可能,还是很多很逆天 @A@
作者: leo80042 (嗯嗯啊啊去洗澡)   2013-07-11 00:50:00
很有趣 XD 推!

Links booklink

Contact Us: admin [ a t ] ucptt.com