午後のひとときに、連分数展開するプログラムを作ってみる。
昨日の数学の記事の続きということです。
renbunsuutenkai.c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(int argc, char *argv[])
{
int r,r2,a,b,u,l;
int s=1,e=100;
if ( argc == 2 ) {
s = e = atoi(argv[1]);
} else if ( argc == 3 ) {
s = atoi(argv[1]);
e = atoi(argv[2]);
}
for (r2=s; r2<=e; r2++) {
u = a = r = sqrt(r2);
l = b = r2-r*r;
if ( b == 0 ) {
printf("√(%d)=%d\n",r2,r);
} else {
printf("√(%d)=[%d; {%d",r2,r,(r+a)/b);
do {
a = (r+a)/b*b-a;
b = (r2-a*a)/b;
if ( u != a || l != b ) {
printf(", %d",(r+a)/b);
}
} while ( u != a || l != b );
printf("}]\n");
}
}
return EXIT_SUCCESS;
}
パラメーターとして、
1つ指定すれば、その値だけ
2つ指定すれば、開始から終了
それ以外は、1から100まで
> renbunsuutenkai
√(1)=1
√(2)=[1; {2}]
√(3)=[1; {1, 2}]
√(4)=2
√(5)=[2; {4}]
√(6)=[2; {2, 4}]
√(7)=[2; {1, 1, 1, 4}]
√(8)=[2; {1, 4}]
√(9)=3
√(10)=[3; {6}]
√(11)=[3; {3, 6}]
√(12)=[3; {2, 6}]
√(13)=[3; {1, 1, 1, 1, 6}]
√(14)=[3; {1, 2, 1, 6}]
√(15)=[3; {1, 6}]
√(16)=4
√(17)=[4; {8}]
√(18)=[4; {4, 8}]
√(19)=[4; {2, 1, 3, 1, 2, 8}]
√(20)=[4; {2, 8}]
√(21)=[4; {1, 1, 2, 1, 1, 8}]
√(22)=[4; {1, 2, 4, 2, 1, 8}]
√(23)=[4; {1, 3, 1, 8}]
√(24)=[4; {1, 8}]
√(25)=5
√(26)=[5; {10}]
√(27)=[5; {5, 10}]
√(28)=[5; {3, 2, 3, 10}]
√(29)=[5; {2, 1, 1, 2, 10}]
√(30)=[5; {2, 10}]
√(31)=[5; {1, 1, 3, 5, 3, 1, 1, 10}]
√(32)=[5; {1, 1, 1, 10}]
√(33)=[5; {1, 2, 1, 10}]
√(34)=[5; {1, 4, 1, 10}]
√(35)=[5; {1, 10}]
√(36)=6
√(37)=[6; {12}]
√(38)=[6; {6, 12}]
√(39)=[6; {4, 12}]
√(40)=[6; {3, 12}]
√(41)=[6; {2, 2, 12}]
√(42)=[6; {2, 12}]
√(43)=[6; {1, 1, 3, 1, 5, 1, 3, 1, 1, 12}]
√(44)=[6; {1, 1, 1, 2, 1, 1, 1, 12}]
√(45)=[6; {1, 2, 2, 2, 1, 12}]
√(46)=[6; {1, 3, 1, 1, 2, 6, 2, 1, 1, 3, 1, 12}]
√(47)=[6; {1, 5, 1, 12}]
√(48)=[6; {1, 12}]
√(49)=7
√(50)=[7; {14}]
√(51)=[7; {7, 14}]
√(52)=[7; {4, 1, 2, 1, 4, 14}]
√(53)=[7; {3, 1, 1, 3, 14}]
√(54)=[7; {2, 1, 6, 1, 2, 14}]
√(55)=[7; {2, 2, 2, 14}]
√(56)=[7; {2, 14}]
√(57)=[7; {1, 1, 4, 1, 1, 14}]
√(58)=[7; {1, 1, 1, 1, 1, 1, 14}]
√(59)=[7; {1, 2, 7, 2, 1, 14}]
√(60)=[7; {1, 2, 1, 14}]
√(61)=[7; {1, 4, 3, 1, 2, 2, 1, 3, 4, 1, 14}]
√(62)=[7; {1, 6, 1, 14}]
√(63)=[7; {1, 14}]
√(64)=8
√(65)=[8; {16}]
√(66)=[8; {8, 16}]
√(67)=[8; {5, 2, 1, 1, 7, 1, 1, 2, 5, 16}]
√(68)=[8; {4, 16}]
√(69)=[8; {3, 3, 1, 4, 1, 3, 3, 16}]
√(70)=[8; {2, 1, 2, 1, 2, 16}]
√(71)=[8; {2, 2, 1, 7, 1, 2, 2, 16}]
√(72)=[8; {2, 16}]
√(73)=[8; {1, 1, 5, 5, 1, 1, 16}]
√(74)=[8; {1, 1, 1, 1, 16}]
√(75)=[8; {1, 1, 1, 16}]
√(76)=[8; {1, 2, 1, 1, 5, 4, 5, 1, 1, 2, 1, 16}]
√(77)=[8; {1, 3, 2, 3, 1, 16}]
√(78)=[8; {1, 4, 1, 16}]
√(79)=[8; {1, 7, 1, 16}]
√(80)=[8; {1, 16}]
√(81)=9
√(82)=[9; {18}]
√(83)=[9; {9, 18}]
√(84)=[9; {6, 18}]
√(85)=[9; {4, 1, 1, 4, 18}]
√(86)=[9; {3, 1, 1, 1, 8, 1, 1, 1, 3, 18}]
√(87)=[9; {3, 18}]
√(88)=[9; {2, 1, 1, 1, 2, 18}]
√(89)=[9; {2, 3, 3, 2, 18}]
√(90)=[9; {2, 18}]
√(91)=[9; {1, 1, 5, 1, 5, 1, 1, 18}]
√(92)=[9; {1, 1, 2, 4, 2, 1, 1, 18}]
√(93)=[9; {1, 1, 1, 4, 6, 4, 1, 1, 1, 18}]
√(94)=[9; {1, 2, 3, 1, 1, 5, 1, 8, 1, 5, 1, 1, 3, 2, 1, 18}]
√(95)=[9; {1, 2, 1, 18}]
√(96)=[9; {1, 3, 1, 18}]
√(97)=[9; {1, 5, 1, 1, 1, 1, 1, 1, 5, 1, 18}]
√(98)=[9; {1, 8, 1, 18}]
√(99)=[9; {1, 18}]
√(100)=10
こうやって並んだ出力をみると、面白い性質が見えてきます。
ある平方数n2から次の平方数(n+1)2までが連分数になるのですが、
最初の項はn、最後の項は2nになっています。
やってみなければ解らないことですよね。
最初は手計算で何度かやってみて、
プログラミングして、一気に解を求める。
数学も面白いのですが、プログラミングはまた違った面白味がありますね。
さて、次はどんなプログラミングをしようかな。
連分数表記から分数表記への変換が出来るといいかな。
ではでは
↧
連分数展開のプログラムを作る
↧