$1 \sim n$ までのカードを並び替えて素数になる確率を、Pythonでサーベイしました。

こちらの記事に、次の話題がありました。

ここに、1~9の数字が書かれたカードが1枚ずつ、合計9枚あります。

これらのカードを自由に並び替えて9桁の整数を作ります。

その数が素数になるように並べることはできるでしょうか?

素数の不思議 – 素数の魅力を紹介しています!

$1 \sim n$ のときは,どうなるか考えてみました。
とりあえず、$ n \leq 9$ のときだけを考えました。

def sigma(m, n, func, s = 0) :
    if m > n: return s
    return sigma(m + 1, n, func, s + func(m))

これで、和の関数を定義しました。この関数は、完全に次のサイトを参考にしました。

Pythonで総和を実装 #Python - Qiita

総和の式を実装してみる\sum_{i=m}^{n} f(x) = f(m) + f(m+1) + \cdots + f(n) \\def sigma(m, n, func, s = 0) : i…

あとは、ポツポツと、コードを組みました。

Pythonでピックアップさせました。

#1~nのカードを並べ替えたときの整数の素数判定
from sympy import isprime
import itertools

n = int(input("桁数を入力してください。"))

card = []
for i in range(1,n+1):
  card.extend([i])

perm = list(itertools.permutations(card))
s = len(perm)

t = 0
z = 0

while t <= s-1:
  number = sigma(0, n-1, lambda x : perm[t][x]*10**(n-x-1))
  if isprime(number) == True:
    print(str(number)+"は,primeです。")
    z=z+1
  t = t+1
print("素数の個数は"+str(z)+"個です。ちなみに,すべての整数の個数は,"+str(s)+"個です。")
print("素数になる確率は"+str(z/s)+"です。")

こうやってあげると、カードの並べ方の総数のうち、素数が現れる確率まで求めることができました。

結果1($1 \sim 4$ のとき)

素数は「4個」でした。

結果2($1 \sim 7$ のとき)

素数は「534個」でした。

ちなみに、このアルゴリズムで「n=10」に設定すると、えらいことになりました。
冗談抜きに、「素数の宝箱や〜」と、ほんまになりました。

ちゃんちゃん。