非自明1の平方根の計算

10 adic number の世界では非自明な1の平方根が存在します。その近似計算法についてまとめます。

方法1

1の平方根と2乗しても変わらない数 によれば \[ \sqrt{1} = \lim_{n\to \infty} \frac{5^n-2^n}{5^n+2^n} \] によって求めることができます。 ここで注意したいのは右辺の割り算はmodの世界の割り算として行わなければならない点です。 Maximaでは mod n の世界のaの逆数は

inv_mod(a,n)

によって求めることができます。

N:10$ /*10桁求める*/
M:10^N$ 
a(n):=mod(5^n-2^n,M)$
b(n):=inv_mod(5^n+2^n,M)$
c(n):=mod(a(i)*b(i),M)$
for i thru N+2 do print(c(i))$

実行結果.

1428571429
3793103449
1879699249
31201249
7345581249
5287781249
9205781249
4625781249
4425781249
6425781249
6425781249
6425781249

実行結果から、収束していく様子が見て取れます。

最後の行を取り出して、これが本当に1の平方根の近似値になっているか、次のように検算してみます。
a:6425781249$ a^2;

実行結果.

41290664660000000001

確かに、10進数的に1に近い数になっていることが確認できます。

方法2

\[ \lim_{n \to \infty} 5^{2^n} = \frac{1+\sqrt{1}}{2} \] を利用します。これを$\sqrt{1}$についてとくと \[ \sqrt{1} = 2\lim_{n \to \infty} 5^{2^n} -1 \] が得られます。

単純にmodだけを使用すると、すぐにオーバーフローを起こしてしまいますので 指数に特化した関数
power_mod を利用します。

power_mod(a,b,n) は a^b mod n を計算します。

N:10$
c(n):=mod(2*power_mod(5,2^i,10^N)-1,10^N)$
for i thru N+2 do print(c(i))$

実行結果.

49
1249
781249
5175781249
3925781249
1425781249
6425781249
6425781249
6425781249
6425781249
6425781249
6425781249

外側のmodにあまり意味はありません。これを外しても計算できますが、 1桁ほど信用できない桁が入る可能性があります。