40-32÷2=4!の一般解 (4) 巨大因数の探索
[latexpage]
前回から続いて、${(w-1)!-1}$ が合成数である場合を考えましょう。
基本的な考え方は素数の場合と同じです。
解を持つ $z$ の条件は、
\[
\begin{equation}
z < (w-1)! \tag{5}
\end{equation}
\]
\[
\begin{equation}
(z-1) | \left(w ((w-1)! – 1)\right)\tag{6}
\end{equation}
\]
です。
(6)より、$w$の素因数と、${(w-1)! – 1}$の素因数をそれぞれ求めて、 その組合せから${w ((w-1)! – 1)}$のすべての約数を求めればよいでしょう。そのときは、(5)の条件も考慮して不必要な要素を省いていきます。
さて、ここまで、最初の問題の解のパターンを、すべて導出するという目的で議論してきましたが、これらの問題はある種のパターンの合成数に対する素因数分解の問題に深くかかわっていることがわかってきました。
とても残念ですが、素因数分解の問題を一般性を残したまま扱うのは、そろそろ限界かもしれません。
そこで、視点を変えて、大きな$w$の値に対して、$x$, $y$, $z$, $w$ を計算するということにチャレンジしてみます。
大きいといっても $w!$ を計算するわけですからあまり大きくし過ぎると、数値が爆発してしまいます。
また${(w-1)! – 1}$の素因数分解も困難になりますので、適度なところをとって${w=24}$としてみましょう。このとき、${(w-1)! – 1}$は合成数となります。
\[23!-1 = 51871 \cdot 498390560021687969\]
また$w=24$を素因数分解すると、
\[24 = 2^3 \cdot 3\]
となります。
$z-1$の候補はそれぞれの積の約数ですから、
$24$から$2^2\cdot 3=12$、$23!-1$から$51871$の約数をそれぞれとって
\[z – 1 = 2^2\cdot 3 \cdot 51871 = 622452\]
を選んでみます。すると
\[z = 622453\]
これを、$x$, $y$ の式に代入して計算します。
\[x = \frac{z w ((w-1)! – 1)}{(z-1)} = 620449398514359482735914\]
\[y = x – z w = 620449398514359467797042\]
したがって、求める式は、
\[620449398514359482735914 – 620449398514359467797042 \div 622453 = 24!\]
私はこれをJavaのプログラムで計算しましたが、
どうやらWindowsの関数電卓でも桁落ちなしで計算できるようです。(Windows意外とできる子です笑)
ちなみにgoogleさんの電卓は浮動小数点になってだめでした。
それぐらい大きな数の計算ができるようになったわけです。
ひとまずここまで。
追記[2012/11/29]
Rubyでのソースコードを追加してみました。
Javaと違ってBigintなどの型に自動で変換されるようですね。ソースコードが非常に簡潔です。
# 階乗を計算する関数 def fact(n) if n==0 then return 1 else return fact(n-1)*n end end # 数値の定義 w = 24 z = 622453 x = z * w * (fact(w-1)-1)/(z-1) y = x - z * w # 解の表示 puts "# x - y / z = w!" puts "# (x - y)/ z = w" puts "x = "+x.to_s puts "y = "+y.to_s puts "z = "+z.to_s puts "w = "+w.to_s