ユークリッド-マリン数列
http://commutative.world.coocan.jp/blog5/2022/01/post-523.html
元のプログラムでは第 6 項の 50207 までなら 0.035977 秒で計算できる。しかし,第 7 項まで出そうとすると 1912.027524 秒かかる。しかも出てきた答え 547985393 は間違いである。
関数化,isprime()を使用するという小手先では 1887.464951 秒までしか縮まらずしかも出てくる答えは同じく 547985393 で間違いである。
計算のヒントは,元記事に「そもそも(第 7 項は)、340999 とあるけど、これは、2, 3, 7, 43, 139, 50207 をすべて掛け合わせて 1 を足した数である 12603664039 から、それの最大の素因数として求める」と書いてある。
また,数列のことならいつもの「オンライン整数列大辞典」ということで,検索してみると A000946 で,説明も同じ内容である。
Euclid-Mullin sequence: a(1) = 2, a(n+1) is largest prime factor of Product_{k=1..n} a(k) + 1.
元記事には続けて,「12603664039 から 340999 を求めること自体が大変なのだった」と書いているが,どれほど大変なのかプログラムを書いてみた。
using Primes
function Euclid_Mullin_sequence(limit=10)
n = BigInt(2)
println("1: $n")
cum = n
for i in 2:limit
n = factor(Vector, cum + 1)[end]
cum *= n
println("$i: $n")
end
end
関数の引数 limit を 2, 3, 4, ... と増やしていくと,順調に解が求まる。
第 7 項の 340999 までは 0.000345 秒
第 8 項の 2365347734339 までは 0.001223 秒
第 9 項の 4680225641471129 までは 0.322829 秒
第 10 項の 1368845206580129 までは 2.339921 秒
であったが,第 11 項まで求めようとすると相当時間がかかり一向に終わる気配がない。ので,諦めた。
第 11 項は
BigInt(2)*3*7*43*139*50207*340999*2365347734339*4680225641471129*1368845206580129 + 1
= 65127746440715056169703820896799129325103020802826145086639
の素因数分解をしなくてはならない。
高速計算といえば WolframAlpha であるが,流石に計算時間切れであった。
ということで,この問題を解く速いプログラムの定石は,
大変そうかもしれないが別の解法があるなら一応やってみる。
尤も,使える手段(関数)は惜しげなく使う。
かな。
@time Euclid_Mullin_sequence(10)
1: 2
2: 3
3: 7
4: 43
5: 139
6: 50207
7: 340999
8: 2365347734339
9: 4680225641471129
10: 1368845206580129
1.611882 seconds (51.92 M allocations: 1.024 GiB, 24.76% gc time, 0.10% compilation time)
速いときには 2 秒を切ることもある。
@benchmark では最短 1.5 秒程度