👏

juliaで素数を生成する1次式を求める!

2021/06/19に公開

はじめに

元々は次のツイートの問題が発端です。東北大学の入試問題のようです。

https://twitter.com/toriidao/status/1400365296121049091?s=21

この問題について,次のように解けるのではないかと思い,次のようにリツイートしました。

https://twitter.com/dannchu/status/1400571166952026113?s=21

ということで,f(x)=ax+1aは自然数)の形のときは,

『素数pについてf(p)も素数になるものがあるのかな?』

と思いました。『まあ,なさそうかな?』というのがツイッター界隈のコメントでした。

https://twitter.com/ototo_/status/1400387653116129281?s=21

授業での生徒の発見!

そんなことを授業で話していたら,生徒が,

f(x)=6x+1

という関数を持ってきました。最初は『???』と思ったのですが,調べてみると

f(2)=13
f(3)=19
f(5)=31
f(7)=43
f(11)=67
f(13)=79
f(17)=103

f(2)からf(17)まで全て素数でした。でも,残念ながら次のf(19)は115で素数ではありませんでした。

ツイッターみると,この辺りのことに関心のある方もいてやりとりをしました。

https://twitter.com/apu_yokai2/status/1400735523887484930?s=21

その先を調べてみたい!

ということで,f(2)~f(19)まで素数になるようなf(x)=ax+1はあるのかな?ということですが,これはそんなに簡単に見つかるはずもありません。そこでまず,Mathematicaで調べてみることにしました。今はWolfram Cloudで無料で利用できます。いい時代になりました。

https://www.wolframcloud.com

For[a=1,a<10000000,a++,n=1;
While[PrimeQ[f[Prime[n]]],n++];
If[n>7,Print["f(x)=",2a,"x+1,","n=",n-1]]]

f(x)=192660x+1はf(2)~f(19)まで素数です!

まあ,この辺りが,Wolfram Cloud無料版の限界で,f(23)まで素数のものを探そうとするとtimeoutでした。

JuliaのPrimes.jlパッケージ

ということで,最後にJuliaでやってみました。Primes.jlが良さそうです。

http://juliamath.github.io/Primes.jl/v0.3/api.html#Primes.factor

まずはパッケージを読み込んで

import Pkg; Pkg.add("Primes")
using Primes

その後,調べます。

for i=1:1000000000
    n=1
    while isprime(2*i*prime(n)+1)
        n+=1
    end
    if n>9 
        println("f(x)=",2*i,"x+1,","n=",n-1)
    end
end

f(x)=437286240x+1,n=9
f(x)=861211560x+1,n=9
InterruptException:

途中で,切れてしまいましたが,2つ見つかりました。時間はは買っていないのですが,見つかるまで数分だと思います。

f(x)=437286240x+1として,f(2)からf(23)まで書き挙げると,

n=1
while isprime(437286240*prime(n)+1)
 println("f(",prime(n),")=",437286240*prime(n)+1)
     n+=1
end

f(2)=874572481
f(3)=1311858721
f(5)=2186431201
f(7)=3061003681
f(11)=4810148641
f(13)=5684721121
f(17)=7433866081
f(19)=8308438561
f(23)=10057583521

です。

Discussion