以前、こちらの記事でセクシーな素数について紹介しました。
さて、次の二つの数、(5, 11)を見て、これらがどんな数字かわかりますか? View this post on Instagram You know what prime numbers are, but do you know what sexy primes are ? They're prime numbers that differ from each other by 6. 5 and 11 are a pair of sexy primes. So why call them sexy ? Well the word "sexy" is a pun that comes from the Latin word for 6 : sex. Mathematicians have a lot of humour. We know there are an infinite amount of prime numbers but we don't know... "セクシー"な数字たち - sciencompass |
素数の数は無限に存在するので、セクシーな素数も当然、無限に存在すると考えられます。(5, 11), (11, 17), (13, 19)ぐらいはすぐに思いつきますが、大きな数になるとなかなか思いつきません。そもそも大きな数字だと素数かどうか判定するのが大変です。
そこで、Pythonを使って、セクシーな素数を数え上げるプログラムを作ってみました。ソースコードは、最後に載せてあります。
プログラムは①2から1000までの整数の中から、素数を数え上げ素数のリストを作る②素数リストの要素の差を順番に計算し、差がちょうど6の素数をリストアップしていく、という内容になります。
これによって数え上げると、素数は全部で168個あり、セクシーな素数は74組あることがわかります。一番大きなセクシーな素数は、(991, 997)です。ここまでくると、手で数えていくのは大変な数字になりますね。プログラムを少し変えれば、もっと大きなセクシーな素数を見つけることもできます。私が確認した一番大きなセクシーな素数は、(999953, 999959)です。
ここまでお読みいただきありがとうございます。以下は私が作成したセクシー素数を数え上げるプログラムのソースコードになります。
それではまた次の記事でお会いしましょう。
ソースコード
# -*- coding: utf-8 -*- import numpy as np prime = [] for n in range(2, 1001): num = int(np.sqrt(n)) if num == 1: prime.append(n) #print(str(n) + ' is prime') else: for i in range(2, num + 1): if n % i == 0: #print(str(n) + ' is composite') break if i == num and n % i != 0: prime.append(n) #print(str(n) + ' is prime') print(prime) print(len(prime)) sexy_primes = [] s_prime = [] for i in range(len(prime)-1): if i < len(prime) - 1: for j in range(i + 1, len(prime)): if prime[j] - prime[i] == 6: s_prime.append(prime[i]) s_prime.append(prime[j]) sexy_primes.append(s_prime) #print("sexy " + str(prime[i]) + "&" + str(prime[j])) else: if prime[i + 1] - prime[i] == 6: s_prime.append(prime[i]) s_prime.append(prime[i+1]) sexy_primes.append(s_prime) #print("sexy " + str(prime[i]) + "&" + str(prime[i+1])) s_prime = [] print(sexy_primes) print(len(sexy_primes))
Appendix A. ソースコード解説
--- coding: utf-8 --- import numpy as np prime = [] for n in range(2, 1001): num = int(np.sqrt(n)) if num == 1: prime.append(n) #print(str(n) + ' is prime') else: for i in range(2, num + 1): if n % i == 0: #print(str(n) + ' is composite') break if i == num and n % i != 0: prime.append(n) #print(str(n) + ' is prime') print(prime)
ここまでが、指定した範囲の整数の中で、素数であるものを数え上げ、リストを作成する部分になります。素数かどうかの判定は非常に単純で、判定したい整数よりも小さい数字で順番に割っていき、割り切れなかったら素数と判定しています。このとき、割る数は判定する整数の平方根以下の整数までで十分です。
print(len(prime)) sexy_primes = [] s_prime = [] for i in range(len(prime)-1): if i < len(prime) - 1: for j in range(i + 1, len(prime)): if prime[j] - prime[i] == 6: s_prime.append(prime[i]) s_prime.append(prime[j]) sexy_primes.append(s_prime) #print("sexy " + str(prime[i]) + "&" + str(prime[j])) else: if prime[i + 1] - prime[i] == 6: s_prime.append(prime[i]) s_prime.append(prime[i+1]) sexy_primes.append(s_prime) #print("sexy " + str(prime[i]) + "&" + str(prime[i+1])) s_prime = [] print(sexy_primes) print(len(sexy_primes))
この部分で素数のリストの要素を一つ一つ差分をとって、差が6になるかどうかを調べて、リストアップしています。二つの差が6以上になった時点で、次の要素に移るようにしたほうが、処理ははやくなります。記事を書いているときに気づきました。今後、改良しておきます。