√2だけの近似だけで使い道が限られるね。[br]そこで、もっとさまざまな平方根を求められるようにしてみよう。[br][br]√2の連分数展開は[1;[u]2[/u]]で、サイクル1だったが、他の平方根ではサイクルがいろいろる。[br][u]どうしてそうなるかはさておき[/u]、連分数展開を1つの分数や小数に直す関数を作ってみよう。[br]調べたい分数の長さをcntとしてサイクルを回して、分数の全長をcntにしたdistを作ろう。[br]有限な連分数の計算順位は最後尾が最優先になるので、逆順のrevを作ろう。[br]あとは、逆数にしてリストの数をたす。[br]これをくりかえそう。これで1未満のパートのpartができる。[br]最後のDataの先頭にある整数部分を最後にたそう。[br][br][color=#0000ff]#[IN]Python[br]#=================================================================[br]from fractions import Fraction[br]from itertools import cycle[br]f = lambda n:Fraction(n,1)[br]#(n,[cycle])[br]datum = [(1,[2]),(1,[1,2]),(2,[4]),(2,[1,1,1,4]),(3,[3,6]),(3,[1,1,1,1,6]),(4,[8]),(4,[2,1,3,1,2,8])][br]D =[2,3,5,7,11,13,17,19][br]def continued_fraction(Data,cnt):[br] n,lst = Data[0],Data[1][br] dist = [][br] for i in cycle(lst):[br] dist.append(i)[br] if len(dist)>cnt-1 :[br] break[br] rev=list(reversed(dist))[br] print(dist,"-->",rev)[br] part=f(1)/f(rev[0])[br] for i in range(1,cnt):[br] part=f(rev[i])+part[br] part=f(1)/part[br] return f(n)+part[br]cnt=20[br]for i in range(len(D)):[br] p=continued_fraction(datum[i],cnt)[br] print(float(p),":",p,":√",D[i])[br][br]#=================================================================[br][/color][OUT][br][2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2] --> [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2][br]1.4142135642135643 : 19601/13860 :√ 2[br][1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1] --> [1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1][br]1.7320512820512821 : 1351/780 :√ 3[br][4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4] --> [4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4][br]2.236067977499794 : 16692641/7465176 :√ 5[br][1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1] --> [1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1][br]2.645751633986928 : 2024/765 :√ 7[br][3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3] --> [3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3][br]3.3166247903554016 : 31521799/9504180 :√ 11[br][1, 1, 1, 1, 6, 1, 1, 1, 1, 6, 1] --> [1, 6, 1, 1, 1, 1, 6, 1, 1, 1, 1][br]3.6055514974433893 : 4936/1369 :√ 13[br][8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8] --> [8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8][br]4.123105625617661 : 41270070401/10009462320 :√ 17[br][2, 1, 3, 1, 2, 8, 2, 1, 3, 1, 2] --> [2, 1, 3, 1, 2, 8, 2, 1, 3, 1, 2][br]4.3588989441930615 : 57799/13260 :√ 19[br][br][color=#0000ff]juliaでもほとんど変わらない。[br]#[IN]Julia[br]#=================================================================[br]f = n -> n//1[br]#(n,[cycle])[br]datum = [(1,[2]),(1,[1,2]),(2,[4]),(2,[1,1,1,4]),(3,[3,6]),(3,[1,1,1,1,6]),(4,[8]),(4,[2,1,3,1,2,8])][br]D =[2,3,5,7,11,13,17,19][br]function continued_fraction(Data,cnt)[br] (n,lst) = Data[br] dist=[ ][br] for (i, v) in enumerate(Iterators.cycle(lst))[br] push!(dist,v)[br] i > cnt-1 && break[br] end[br] rev=reverse(dist)[br] println(dist,"-->",rev)[br] part=f(1)/f(rev[1])[br] for i in 2:cnt[br] part=f(rev[i])+part[br] part=f(1)/part[br] end[br] return f(n)+part[br]end[br]cnt=20[br]for i in 1:length(D)[br] p=continued_fraction(datum[i],cnt)[br] println(float(p),":",p,":√",D[i])[br]end[br][/color]#=================================================================[color=#0000ff][br][OUT][/color][br]Any[2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]-->Any[2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2][br]1.4142135623730947:54608393//38613965:√2[br]Any[1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2]-->Any[2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1][br]1.732050807565499:716035//413403:√3[br]Any[4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]-->Any[4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4][br]2.23606797749979:7331474697802//3278735159921:√5[br]Any[1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4]-->Any[4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1][br]2.645751311063895:2388325//902702:√7[br]Any[3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6]-->Any[6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3][br]3.3166247903554:31539640338297//9509559365899:√11[br]Any[1, 1, 1, 1, 6, 1, 1, 1, 1, 6, 1, 1, 1, 1, 6, 1, 1, 1, 1, 6]-->Any[6, 1, 1, 1, 1, 6, 1, 1, 1, 1, 6, 1, 1, 1, 1, 6, 1, 1, 1, 1][br]3.6055512754637564:5564523//1543321:√13[br]Any[8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8]-->Any[8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8][br]4.123105625617661:6355271576489378132//1541379764079492545:√17[br]Any[2, 1, 3, 1, 2, 8, 2, 1, 3, 1, 2, 8, 2, 1, 3, 1, 2, 8, 2, 1]-->Any[1, 2, 8, 2, 1, 3, 1, 2, 8, 2, 1, 3, 1, 2, 8, 2, 1, 3, 1, 2][br]4.358898943540674:512445947//117563163:√19