◆愛知県 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 );
}