概要
タイトルのとおりだが、素数を2次形式で表現する手法がある。これをスクリプトで求めてみる。
コード
まず1000以下の素数を収集する。
import sympy primes = [] for p in sympy.primerange(1000): if p % 8 == 1: primes.append(p) print(primes)
[17, 41, 73, 89, 97, 113, 137, 193, 233, 241, 257, 281, 313, 337, 353, 401, 409, 433, 449, 457, 521, 569, 577, 593, 601, 617, 641, 673, 761, 769, 809, 857, 881, 929, 937, 953, 977]
前記であつめた素数を走査して、その素数以下のzを走査して \(y^2 = p+2z^2\) を求め、完全平方数かを判定する。
for p in primes: for z in range(p): y2 = p + 2 * z * z if y2 <= 0: break y, flg = sympy.integer_nthroot(y2, 2) if flg: assert p == y * y - 2 * z * z print(f"{p:3} = {y:2}^2 - 2 * {z:2}^2") # 複数あるが、最初のひとつ以外は除外する break
17 = 5^2 - 2 * 2^2 41 = 7^2 - 2 * 2^2 73 = 9^2 - 2 * 2^2 89 = 11^2 - 2 * 4^2 97 = 13^2 - 2 * 6^2 113 = 11^2 - 2 * 2^2 137 = 13^2 - 2 * 4^2 193 = 15^2 - 2 * 4^2 233 = 19^2 - 2 * 8^2 241 = 21^2 - 2 * 10^2 257 = 17^2 - 2 * 4^2 281 = 17^2 - 2 * 2^2 313 = 21^2 - 2 * 8^2 337 = 25^2 - 2 * 12^2 353 = 19^2 - 2 * 2^2 401 = 23^2 - 2 * 8^2 409 = 21^2 - 2 * 4^2 433 = 21^2 - 2 * 2^2 449 = 29^2 - 2 * 14^2 457 = 23^2 - 2 * 6^2 521 = 23^2 - 2 * 2^2 569 = 31^2 - 2 * 14^2 577 = 33^2 - 2 * 16^2 593 = 25^2 - 2 * 4^2 601 = 27^2 - 2 * 8^2 617 = 25^2 - 2 * 2^2 641 = 29^2 - 2 * 10^2 673 = 31^2 - 2 * 12^2 761 = 31^2 - 2 * 10^2 769 = 29^2 - 2 * 6^2 809 = 29^2 - 2 * 4^2 857 = 37^2 - 2 * 16^2 881 = 41^2 - 2 * 20^2 929 = 31^2 - 2 * 4^2 937 = 35^2 - 2 * 12^2 953 = 31^2 - 2 * 2^2 977 = 37^2 - 2 * 14^2