平成11年10月16日
<美しい数学の話>
第9話 「不思議な平方数」
『8』 1桁の整数1,5,6を平方すると、1,25,36となって下1桁は変わりません。 そこで、問題です。
(3)4桁の整数Nを平方しても下4桁が同じNとなる数字Nを見つけましょう。
★次ぎに、整数Nの桁数を5桁、6桁、・・・ とした場合、このような整数は
果たしてあるのでしょうか? 誰か考えて、教えてください。
<ch3coohさん> から寄せられた解法、10月14日受信
水の流れ:平方の問題について 10進数で、最下位のn桁が2乗しても変化しない値を求めることが課題ですね?
いくつか回答がありましたが、別の方向から考えていました。
x^2≡x(mod n)として x*(x-1)≡0(mod n)が答えを求める方程式と考えました。
ここで、自明な解としては、0,1となりますが、そうでない回答としては、
x,x-1に分散してnの約数が含まれる場合が考えられます。
10進数に限れば、10の約数は2,5なので、5の周辺で、
x=5の場合: x-1= 4= 2^2で2が含まれ
x=6の場合: x= 2*3, x-1=5で2,5の双方が含まれます。
10進数のみでなく、n進数に異なった値を設定した場合のチェックを行いました。
資料1にプログラムを、資料2にデータを示します。
上記のように素数の特性との関連を考慮すると、x, x-1にnを構成する
素数が入っていなくてはならないので、nが素数の場合は課題を満たす
xが存在しないのではないかと推測され、それは大体満足されているようです。
(自動チェックもプログラムに組み込めば良いのですが・・・)
また、単一の素数をm乗した値を準素数とすると、準素数でも課題を満たすxは無いようです。
次に注目した値は30です。この値は、最も小さい3つの素数を含んでいる最小の値です(2*3*5)
この値をbase-numberとして考えると多くの点が条件を満たすものと予測しましたが、おおよそその通りになっています。
ここで、拡張した考え方として、条件を満たす値の存在は、その値を構成している素数の種類の数に従うと思われるのですが・・・
(証明は多分可能だと思う)
例:
100の場合 2^2*5^2で、構成する素数の種類は2、解は自明な値を含めて4持つ
210の場合 2*3*5*7で、構成する素数の種類は4、解は自明な値を含めて16持つ
なんとなくですが、答えの総数は2^"種類の数'であるような気がします。
資料1
#include <stdio.h>
int
test_nshin( int base )
{int f, i, x, y ;printf( "0, 1" ) ; f= 0 ;
for( i= 2 ; i< base ; i++ ){ x= i*i ; y= x%base ;
if ( y== i ) { printf( ", %3d", i ) ; f= 1 ; }}
return f ;}
int main( void ){ int i ;
for( i= 3 ; i< 100 ; i++ ){printf( "%3d : ", i ) ;
test_nshin( i ) ;
putchar( '\n' ) ;}
return 0 ;}
資料2
3 : 0, 1
4 : 0, 1
5 : 0, 1
6 : 0, 1, 3, 4
7 : 0, 1
8 : 0, 1
9 : 0, 1
10 : 0, 1, 5, 6
11 : 0, 1
12 : 0, 1, 4, 9
13 : 0, 1
14 : 0, 1, 7, 8
15 : 0, 1, 6, 10
16 : 0, 1
17 : 0, 1
18 : 0, 1, 9, 10
19 : 0, 1
20 : 0, 1, 5, 16
21 : 0, 1, 7, 15
22 : 0, 1, 11, 12
23 : 0, 1
24 : 0, 1, 9, 16
25 : 0, 1
26 : 0, 1, 13, 14
27 : 0, 1
28 : 0, 1, 8, 21
29 : 0, 1
30 : 0, 1, 6, 10, 15, 16, 21, 25
31 : 0, 1
32 : 0, 1
33 : 0, 1, 12, 22
34 : 0, 1, 17, 18
35 : 0, 1, 15, 21
36 : 0, 1, 9, 28
37 : 0, 1
38 : 0, 1, 19, 20
39 : 0, 1, 13, 27
40 : 0, 1, 16, 25
41 : 0, 1
42 : 0, 1, 7, 15, 21, 22, 28, 36
43 : 0, 1
44 : 0, 1, 12, 33
45 : 0, 1, 10, 36
46 : 0, 1, 23, 24
47 : 0, 1
48 : 0, 1, 16, 33
49 : 0, 1
50 : 0, 1, 25, 26
51 : 0, 1, 18, 34
52 : 0, 1, 13, 40
53 : 0, 1
54 : 0, 1, 27, 28
55 : 0, 1, 11, 45
56 : 0, 1, 8, 49
57 : 0, 1, 19, 39
58 : 0, 1, 29, 30
59 : 0, 1
60 : 0, 1, 16, 21, 25, 36, 40, 45
61 : 0, 1
62 : 0, 1, 31, 32
63 : 0, 1, 28, 36
64 : 0, 1
65 : 0, 1, 26, 40
66 : 0, 1, 12, 22, 33, 34, 45, 55
67 : 0, 1
68 : 0, 1, 17, 52
69 : 0, 1, 24, 46
70 : 0, 1, 15, 21, 35, 36, 50, 56
71 : 0, 1
72 : 0, 1, 9, 64
73 : 0, 1
74 : 0, 1, 37, 38
75 : 0, 1, 25, 51
76 : 0, 1, 20, 57
77 : 0, 1, 22, 56
78 : 0, 1, 13, 27, 39, 40, 52, 66
79 : 0, 1
80 : 0, 1, 16, 65
81 : 0, 1
82 : 0, 1, 41, 42
83 : 0, 1
84 : 0, 1, 21, 28, 36, 49, 57, 64
85 : 0, 1, 35, 51
86 : 0, 1, 43, 44
87 : 0, 1, 30, 58
88 : 0, 1, 33, 56
89 : 0, 1
90 : 0, 1, 10, 36, 45, 46, 55, 81
91 : 0, 1, 14, 78
92 : 0, 1, 24, 69
93 : 0, 1, 31, 63
94 : 0, 1, 47, 48
95 : 0, 1, 20, 76
96 : 0, 1, 33, 64
97 : 0, 1
98 : 0, 1, 49, 50
99 : 0, 1, 45, 55
<水の流れ:コメント> >10月14日発信
10進数のみでなく、n進数に異なった値を設定した場合のチェックを行いました。
資料1にプログラムを、資料2にデータを示します。
上記のように素数の特性との関連を考慮すると、x, x-1にnを構成する
素数が入っていなくてはならないので、nが素数の場合は課題を満たす
xが存在しないのではないかと推測され、それは大体満足されているようです。
(自動チェックもプログラムに組み込めば良いのですが・・・)
また、単一の素数をm乗した値を準素数とすると、準素数でも課題を満たすxは無いようです
。上の青いところ私の力不足で現在理解を超えていますので、もう一度お願いします。
また、資料2の数字がなんのことか、今のところピンート来ていません。
ごめんなさい。教えてください。
「平方の問題」は水の流れ先としてリンクを貼ってあります。ご覧ください。
また、いろいろと教えてください。
<ch3coohさん> から寄せられた説明、10月15日受信
通常、私たちが使用しているのは10で桁上がりをする10進数です。
これは、桁上がりを行う単位として、ある程度考えやすいレベル(あまりにも多いと大変です。)で決められたものだと思います。
(最も、分かり易い考えとしては、人間の指の数がこうなった理由と思われる。)
ただし、日常使用する単位でも、10進数以外を使用することはあります。
最も良い例は、角度と時間です。あれらの単位は、12進数をベースとして設定されていますね?
"値"というもの自身を考えると、人間が便宜的に使用している10進数はそれ程意味がある訳ではないとも考えられます。
たとえば、コンピュータの世界では、中間的なレベルを用いることが大変であるため、2進数を使用します。
(ただし、それでは情報量が細かすぎて、人が扱いづらいので、プログラミングでは16進数や8進数を用いることが多い)
では、この"桁上がり"を行う単位を2以外の値として設定できるでしょうか?
適当な取り決めの元に、決定すれば、好きなように設定可能と思われます。
(これを考え付いたのは"フェルマーの最終予測:現在では大定理"について、
a^n+b^n=c^nの各要素をa= a1+a2*n+a3*n^2...で0<=am<nとして、項を展開した場合を考えたからです。)
この考え方に、やや近いのが、(mod n)の世界です。
さて、実際にプログラムで何をやっているかを示します。
その前に、道具立てとしてn進数の表示を考えます。
(これは、最終的にはn>10の場合を含むので何らかの分かり易い表示方法が必要だからです。)
n進数については後ろに(n)をつけるものとし、各桁の内容は10進数、桁の区切りを','とします。
また、10進数は特別な区切りを不要とします。
例えば、21進数で3桁の数字と10進数の変換を考えます。
2,15,11(21)= 2*21^2+15*21+11= 882+315+11= 1218 です。
では、表として出した値が何であるかを示します。
6 : 0, 1, 3, 4
"6"というのは、6進数の場合です。
6進数で1桁の値は0,1,2,3,4,5です。
0^2= 0= 0(6)
1^2= 1= 1(6)
2^2= 4= 4(6)
3^2= 9= 1,3(6) : 9= 1*6+3
4^2= 16= 2,4(6) : 16= 2*6+4
5^2= 25= 4,1(6) : 25= 4*6+1
となりました。
ここで、二乗した結果の一桁目が同じ値である数字は0,1,3,4です。
これが、後ろに付いている値です。
では、9進数ではどうなるでしょうか?
0^2= 0= 0(9)
1^2= 1= 1(9)
2^2= 4= 4(9)
3^2= 9= 1,0(9)
4^2= 16= 1,7(9)
5^2= 25= 2,7(9)
6^2= 36= 4,0(9)
7^2= 49= 5,4(9)
8^2= 64= 7,1(9)
となります。
結果を見ると、二乗した結果の一桁目が同じ値である数字は自明な値である0,1のみです。
これは、9=3^2と、構成する素数の種類が1つであるからだと思います。
x^2≡x(mod 9)
x*(x-1)≡0(mod 9)
で、一桁目の値が合致する条件を考えると・・・
x*(x-1)= y*9= y*3*3であれば、(mod 9)で一桁目が合致するはずですね?
ここで、x,x-1の一方に約数3が含む値を設定すると、他方は約数3を含まない。
ゆえに、一方の値のみに、素数3が2つ含まれる値のみが上記の条件を満たす。
・・・となると、
x= y*9 or x= y*9+1ですが、これは(mod n)では0,1のみとなってしまいます。
で、このような値は"特殊な値"であるものとし、準素数(= 構成する素数が1つのみ)
と"便宜的"に命名しました。
ちなみに、プログラムでチェックしたところ、2〜9999進数の範囲内では、
上記のような値の条件とnの構成する素数の数の関係は予測に合致しています。
+αの情報として、
x^2= (n-y)^2= n^2-2*n*y+y*2です。(x= n-y)
そのため、1,2,3... とn-1,n-2,n-3...という値についての(mod n)の結果は一致し、
二乗した場合の一桁目は対称的な値となるます。
最初のページへもどる