『充平方数』解答


◆愛知県 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=325である。

【問題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のふるいをかけられたパターンは、
1〜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
とできる。

2は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備考
189 
22882899からの列
3675676 
498009801 
51216712168 
6235224235225 
73329283329299からの列
8465124465125 
918252001825201676からの列
101130976811309769 
113841992003841992019801からの列
1259219222459219222512168からの列

プログラム(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 );
}


 『充平方数』へ

 数学の部屋へもどる