プログラムを視野に入れるなら、次のような考え方でいけると思います。
可能なら、???さんや他の方にもプログラムを組んでいただいて検証していただければうれしいです。
10^nの桁の数字をa[n]とする。
10^nの桁まで求めた数字X[n]は
X[n]=a[n]*10^n+a[n-1]*10^(n-1)+...+a[1]*10+a[0]
と書ける。
これの二乗を計算したとき、10^(n+1)の桁は
a[1]*a[n]+a[2]*a[n-1]+...+a[n]*a[1]
と10^nの桁以下からの繰り上がりbとの和である。
これの一の位が10^(n+1)の桁の数字になり、それがa[n+1]を決めることになる(a[0]=5か6で決め方は異なるが)。
a[0]=5の場合を考える。
この繰り上がりbがどうなっているかを考える。
X[n]の二乗の10^nの桁の計算をすると
a[0]*a[n]+a[1]*a[n-1]+...+a[n]*a[0]
と10^(n-1)の桁以下からの繰り上がりcとの和になるので、
a[0]*a[n]+a[1]*a[n-1]+...+a[n]*a[0]+c
である。
題意よりこれの一の位がa[n]に一致していたはずであり、a[n]を引いて10で割った数
(a[0]*a[n]+a[1]*a[n-1]+...+a[n]*a[0]+c-a[n])/10
が次の10^nの桁への繰り上がりbになる。
ここで、繰り上がりcは10^(n-1)以下の計算で生じるので、a[n]*10^nは計算式に全く含まれない。
すなわちあらかじめX[n-1]の二乗を計算し、10^(n-1)の桁以下から10^nの桁への繰り上がりがdだったとすると、dをそのままcに用いることができる。
したがってX[n-1]の二乗計算で10^(n-1)の桁以下からの10^nの桁への繰り上がりをb[n]と書くことにすると、X[n]^2の10^nへの繰り上がりcもX[n-1]^2の10^nへの繰り上がりdも
c=d=b[n]
である。
またX[n]^2の10^(n+1)への繰り上がりbは
b=b[n+1]
と書ける。
以上をふまえて、10^(n+1)の桁の数字を求めたい場合(a[0]=5のときを考えることにする)。
10^nの桁の数字a[n]まで求まっているとして、上で考えたようにX[n]の二乗を求めて次のa[n+1]を求めるので
S[n]=a[0]*a[n]+a[1]*a[n-1]+...+a[n]*a[0]
T[n]=a[1]*a[n]+a[2]*a[n-1]+...+a[n]*a[1]
と、繰り上がりb[n]が計算できているとして、まず10^nの桁の計算をしてみると
S[n]+b[n]
であり、題意よりこれの一の位がa[n]に一致している。
したがって10^(n+1)への繰り上がりb[n+1]は
b[n+1]=(S[n]+b[n]-a[n])/10
である。
さらに10^(n+1)の桁は
T[n]+b[n+1]
である。
これの一の位がa[n+1]と求まる。
なおn≠0であれば、S[n]=T[n-1]+2a[0]a[n]
でもある。
具体的にやってみると
a[0]=5、S[0]=25、T[0]=0、b[0]=0
であり、10^0すなわち一の位の計算は
S[0]+b[0]=25
で、これの一の位がa[0]に確かになっている。
10^1への繰り上がりb[1]は
b[1]=(S[0]+b[0]-a[0])/10=(25+0-5)/10=2
である。
さらに10^1の桁は
T[0]+b[1]=0+2=2
である。
これの一の位が2=a[1]である。
以下同じように計算していきますと、a[n],S[n],T[n],b[n]は下のようになると思います。
n a[n] S[n] T[n] b[n]
0 5 25 0 0
1 2 20 4 2
2 6 64 24 2
3 0 24 36 6
4 9 126 36 3
5 8 116 140 12
6 2 160 104 12
7 1 114 109 17
8 2 129 164 13
9 8 244 156 14
10 1 166 150 25
11 9 240 104 19
12 9 194 324 25
13 5 374 283 21
14 2 303 282 39
15 6 342 378 34
16 5 428 396 37
17 2 416 306 46
18 2 326 262 46
19 9 352 445 37
…
n=15までは???さんのコメントと一致していることは確認できました。
さらに、例えばn=19つまり20桁の数字なら
92256259918212890625
と予想されます。
次はa[0]=6も試してみます。
足して100...1になっているようなら正しそうですが果たして…
ボムボム 2009/11/16 19:44
可能なら、???さんや他の方にもプログラムを組んでいただいて検証していただければうれしいです。
10^nの桁の数字をa[n]とする。
10^nの桁まで求めた数字X[n]は
X[n]=a[n]*10^n+a[n-1]*10^(n-1)+...+a[1]*10+a[0]
と書ける。
これの二乗を計算したとき、10^(n+1)の桁は
a[1]*a[n]+a[2]*a[n-1]+...+a[n]*a[1]
と10^nの桁以下からの繰り上がりbとの和である。
これの一の位が10^(n+1)の桁の数字になり、それがa[n+1]を決めることになる(a[0]=5か6で決め方は異なるが)。
a[0]=5の場合を考える。
この繰り上がりbがどうなっているかを考える。
X[n]の二乗の10^nの桁の計算をすると
a[0]*a[n]+a[1]*a[n-1]+...+a[n]*a[0]
と10^(n-1)の桁以下からの繰り上がりcとの和になるので、
a[0]*a[n]+a[1]*a[n-1]+...+a[n]*a[0]+c
である。
題意よりこれの一の位がa[n]に一致していたはずであり、a[n]を引いて10で割った数
(a[0]*a[n]+a[1]*a[n-1]+...+a[n]*a[0]+c-a[n])/10
が次の10^nの桁への繰り上がりbになる。
ここで、繰り上がりcは10^(n-1)以下の計算で生じるので、a[n]*10^nは計算式に全く含まれない。
すなわちあらかじめX[n-1]の二乗を計算し、10^(n-1)の桁以下から10^nの桁への繰り上がりがdだったとすると、dをそのままcに用いることができる。
したがってX[n-1]の二乗計算で10^(n-1)の桁以下からの10^nの桁への繰り上がりをb[n]と書くことにすると、X[n]^2の10^nへの繰り上がりcもX[n-1]^2の10^nへの繰り上がりdも
c=d=b[n]
である。
またX[n]^2の10^(n+1)への繰り上がりbは
b=b[n+1]
と書ける。
以上をふまえて、10^(n+1)の桁の数字を求めたい場合(a[0]=5のときを考えることにする)。
10^nの桁の数字a[n]まで求まっているとして、上で考えたようにX[n]の二乗を求めて次のa[n+1]を求めるので
S[n]=a[0]*a[n]+a[1]*a[n-1]+...+a[n]*a[0]
T[n]=a[1]*a[n]+a[2]*a[n-1]+...+a[n]*a[1]
と、繰り上がりb[n]が計算できているとして、まず10^nの桁の計算をしてみると
S[n]+b[n]
であり、題意よりこれの一の位がa[n]に一致している。
したがって10^(n+1)への繰り上がりb[n+1]は
b[n+1]=(S[n]+b[n]-a[n])/10
である。
さらに10^(n+1)の桁は
T[n]+b[n+1]
である。
これの一の位がa[n+1]と求まる。
なおn≠0であれば、S[n]=T[n-1]+2a[0]a[n]
でもある。
具体的にやってみると
a[0]=5、S[0]=25、T[0]=0、b[0]=0
であり、10^0すなわち一の位の計算は
S[0]+b[0]=25
で、これの一の位がa[0]に確かになっている。
10^1への繰り上がりb[1]は
b[1]=(S[0]+b[0]-a[0])/10=(25+0-5)/10=2
である。
さらに10^1の桁は
T[0]+b[1]=0+2=2
である。
これの一の位が2=a[1]である。
以下同じように計算していきますと、a[n],S[n],T[n],b[n]は下のようになると思います。
n a[n] S[n] T[n] b[n]
0 5 25 0 0
1 2 20 4 2
2 6 64 24 2
3 0 24 36 6
4 9 126 36 3
5 8 116 140 12
6 2 160 104 12
7 1 114 109 17
8 2 129 164 13
9 8 244 156 14
10 1 166 150 25
11 9 240 104 19
12 9 194 324 25
13 5 374 283 21
14 2 303 282 39
15 6 342 378 34
16 5 428 396 37
17 2 416 306 46
18 2 326 262 46
19 9 352 445 37
…
n=15までは???さんのコメントと一致していることは確認できました。
さらに、例えばn=19つまり20桁の数字なら
92256259918212890625
と予想されます。
次はa[0]=6も試してみます。
足して100...1になっているようなら正しそうですが果たして…