◆愛知県 Y.M.Ojisan さんからの解答。
【問題1】
数列 Fn+1=(2Fn−1)2 を考える。
Fn+1は平方数⊆充平方数である。
一方 Fn+1−1=4Fn(Fn−1) である。
4は平方数であり、もし、Fnと(Fn−1)が充平方数ならば
Fn+1−1は充平方数である。
ところで 8と9は隣接する充平方数であり、F1=9とおくことにより、
無限に隣接する充平方数の組 Fnと(Fn−1)を得ることができる。
因みにF2=289=172 、F2−1=288=3225である。
【問題2】
4n+2タイプの整数は2の倍数であるが4の倍数ではない。
即ち充平方数ではない。
よって、4連続の充平方数は存在しない。
【発展問題】
自然数の範囲で考える。
【定理1】
p、qが互いに素であるとき適当な a,bがあって、
ap−bq=1 とできる。
∵ 証明略
【非充平方数の条件】
pを素数とするとき p2+kp (k=1〜p−1)は充平方数ではない。
∵ p2+kpはpの倍数である。
しかし、p2で割るとkpあまり、p2の倍数ではない。
【証明】
いま、異なる素数p1〜pmに対して【非充平方数の条件】を用いて整数の集合にふるいをかけたとする。
このとき、連続する長さNの整数列 x,x+1,…,x+N-1のふるいをかけられたパターンは、
p1〜pmの最小公倍数をLとして、
x+bL2,x+1+bL2,…,x+N-1+bL2(b:任意)のパターンと同じである。
つぎにLと素な新たな素数pm+1を用いて、
長さNの整数列中のふるいがかかっていないある数:x+q+bL2 (q=0〜N−1)にふるいがかけられることを示す。
なお、素数の無限存在性はよく知られている。
定理1のx+q倍を考えることにより
apm+1−bL2=x+q となる a,b が存在する。
aがpm+1の倍数でなければ、x+q+bL2 は充平方数ではない。
また、aがpm+1の倍数であるときは、
(a+L2)pm+1−(b+pm+1)L2=x+q を考えることにより
(a+L2)pm+1=x+q+b‘L2
とできる。
L2はpm+1と素であるから、a+L2はpm+1の倍数ではなく、
x+q+b‘L2は充平方数ではない。
以上を繰り返せば任意のN連続数を充平方数でないものとできる。
【考察】 3連続充平方数の探索
2連続の充平方数は問題1解答の8,9の組を初項とする系列以外にも多数あるようです。
問題2により4連続は存在しません。
では3連続はどこかにあるのでしょうか。
プログラムで探索してみました。
方法は【非充平方数の条件】を用いたふるい法によりました。
3.6×109までには3連続のものはなく、下記2連続のみ存在しています。
3連続はないような雰囲気です。
番号 | n−1 | n | 備考 |
1 | 8 | 9 | |
2 | 288 | 289 | 9からの列 |
3 | 675 | 676 | |
4 | 9800 | 9801 | |
5 | 12167 | 12168 | |
6 | 235224 | 235225 | |
7 | 332928 | 332929 | 9からの列 |
8 | 465124 | 465125 | |
9 | 1825200 | 1825201 | 676からの列 |
10 | 11309768 | 11309769 | |
11 | 384199200 | 384199201 | 9801からの列 |
12 | 592192224 | 592192225 | 12168からの列 |
プログラム(C++)
#include <stdio.h> #include <stdlib.h> #include <time.h> #define Last_One ((unsigned int)900000000*(unsigned int)4+(unsigned int)1) // 900,000,000:1GByte Memory 200,000,000:256MByte Memory unsigned char Table[Last_One/4] ; // 0:(2,3,4,5),1:(6,7,8,9)....n-1:(...Last_One) unsigned char Non_JHS_bitmap[4] ={0xC0,0x30,0xC,0x3}; unsigned char Cand_JHS_bitmap[4]={0x40,0x10,0x4,0x1}; clock_t start, finish; double duration; void main() { unsigned int i,Primes,pi,pf,q,qi,qf; start = clock(); // Primes=2 for(i=0;i<(Last_One/4);i++) Table[i]=Non_JHS_bitmap[0]+Cand_JHS_bitmap[2]; // Primes>=3 for(Primes=3;Primes<=(Last_One/2);Primes++) { pi=(Primes-2) >> 2; pf=(Primes-2) & 0x3; if((Table[pi] & Cand_JHS_bitmap[pf])==0) //is Prime { i=1; q=0; while( (Last_One-q) > Primes) { q+=Primes; qi=(q-2) >> 2; qf=(q-2) & 0x3; if(i==Primes) // over Primes^2: Maybe JHS and Not Prime { Table[qi]|=Cand_JHS_bitmap[qf]; i=0; }else // only Primes^1 :Not JHS and Not Prime | Prime { Table[qi]|=Non_JHS_bitmap[qf]; } i++; } } } for(i=0;i<(Last_One/4);i++) { q= Table[i] ; if(q==0xD5) printf(" %u %u %u \n", 4*i+3,4*i+4,4*i+5);// 3-train if(q==0xF5) printf(" %u %u \n", 4*i+4,4*i+5); if(q==0xD7) printf(" %u %u \n", 4*i+3,4*i+4); } finish = clock(); duration = (double)(finish - start) / CLOCKS_PER_SEC; printf( "Check to %u end\n",Last_One); printf( "%10.1f Sec\n", duration ); }