先日の続きです。
プログラムを組む前に、数学的な考証をやっておく必要がある。
問題
n≥6において、F1からFnまでの積pは正整数x, yとして、x2-y2に表せるのか?
表せるならば、f(n)=p=x^2-y^2として、最小のxだけの式を示せ。
例
f(6)=240=16^2-4^2
フィボナッチ数列を列挙してみる。
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, …
これの1項からn項までの積なので、
1, 1, 2, 6, 30, 240, 3120, 65520, 2227680, 122522400, …
f(6)=240=162-42
と出来ると言っているので、おそらくは
f(5)=30は出来ないのだろう。
右辺のx2-y2は、(x-y)(x+y)である。
f(5)=30
=1*30
=2*15
=3*10
=5*6
と2つの正整数の積の形には出来るが、
(x-y)(x+y)の形には出来ないのだろう。
(x-y)と(x+y)との和と差を考える。
和は、
(x+y)+(x-y)=2x
差は、
(x+y)-(x-y)=2y
となる。
つまり、和も差も偶数である必要があるので、2正整数の積は偶奇が異なってはダメということです。
f(5)=30
=1*30 → 偶奇が異なる
=2*15 → 偶奇が異なる
=3*10 → 偶奇が異なる
=5*6 → 偶奇が異なる
となるので、(x-y)(x+y)の形には出来ないということである。
f(6)=240
=1*240 → 偶奇が異なる
=2*120 → 偶奇が等しい → x=(120-2)/2=56, y=(120+2)/2=61
=3*80 → 偶奇が異なる
=4*60 → 偶奇が等しい → x=(60-4)/2=28, y=(60+4)/2=32
=5*48 → 偶奇が異なる
=6*40 → 偶奇が等しい → x=(40-6)/2=17, y=(40+6)/2=23
=8*30 → 偶奇が異なる
=10*24 → 偶奇が等しい → x=(24-10)/2=7, y=(24+10)/2=17
=12*20 → 偶奇が等しい → x=(20-12)/2=4, y=(20+12)/2=16
=15*16 → 偶奇が異なる
と5つの解があるということである。
ある程度、数学的な考証が出来ましたので、テストプログラムを考えてみました。
大外はフィボナッチ数列の積を求めるループ
内側にxのループとする案1
内側に差の右側の項とする案2
と2つの案が出来ました。
以下は、LMを使ってのC言語風のコードである。
フィボナッチ数列の大外は、
a=5;
b=8;
p=240;
i=6;
while ( p < 10^100 ) {
/* 処理 */
c=a+b; /* フィボナッチ数列 */
a=b;
b=c;
p*=c; /* 積 */
}
内側の処理の案1は、
x=ceil(sqrt(p))-1;
do {
x++;
y=ceil(sqrt(x^2-n));
if ( p==x^2-y^2 ) {
printf("f(%d)=%d=%d^2-%d^2\n", i, p, x, y);
break; /* breakしなければ、すべての解を列挙 */
}
} while ( x-y > 1 );
内側の処理の案2は、
q=ceil(sqrt(p));
q-=q%2;
do {
while ( p%q !=0 && q > 0 ) {
r=p/q;
if ( l%2 == 0 ) {
x=(r-q)/2;
y=(r+q)/2;
printf("f(%d)=%d=%d^2-%d^2\n", i, p, x, y);
break; /* breakしなければ、すべての解を列挙 */
}
q-=2;
}
} while ( q > 0 );
どちらが高速に動くのかは微妙なラインではある。
とりあえず、
f(6)=240=16^2-4^2
f(7)=3120=56^2-4^2
f(8)=65520=256^2-4^2
f(9)=2227680=1493^2-37^2
f(10)=122522400=11069^2-19^2
f(11)=10904493600=104425^2-295^2
f(12)=1570247078400=1253095^2-25^2
f(13)=365867569267200=19127694^2-33294^2
f(14)=137932073613734400=371392242^2-351858^2
f(15)=84138564904377984000=9172707781^2-1769531^2
f(16)=83044763560621070208000=288174883685^2-5122715^2
f(17)=132622487406311849122176000=11516183742660^2-767068860^2
f(18)=342696507457909818131702784000=585402859117883^2-2341399867^2
ここまでは解を出してきました。
f(19)が見つかるのか、しばらく放置してみます。
ではでは