ゴールドバッハ予想
すべての 2 よりも大きな偶数は 2 つの素数の和として表すことができる。このとき、2 つの素数は同じであっ
てもよい。
import random
# 素数判定関数
def isprime(N):
if N < 2:
return False
i = 2
while i * i <= N:
if N % i == 0:
return False
i += 1
return True
# 入力と判定
N =2* random.randint(9,50)
# N 以下の素数を探す
result = -1
for p in range(2, N + 1):
if isprime(p) and isprime(N - p):
result = p
break
print(N,result,N-result)
*******************************************************
バーゼル問題
x=0
for y in range(1,5000000):
x+=1/(y**2)
print((6*x)**(0.5))
*******************************************************
コラッツの問題
どんな正の整数も、偶数なら 2 で割り、奇数なら 3 倍して 1 を足す。この操作を繰り返せば、必ず最後は 1 にな
るだろう
import random
i = 0
n = random.randint(9,100)
while n > 1:
i += 1
r = n % 2
if r == 0:
n = n / 2
elif r == 1:
n = n * 3 + 1
else:
print('error!')
break
print(i, ':', n)
*******************************************************
ゴールマハティヒ予想
{x^{m}-1}/{x-1}= {y^{n}-1/}{y-1}}で x > y > 1 かつ m, n > 2 を満たす整数解は次の 2 つに限るということを主張
する。
(x, y, m, n) = (5, 2, 3, 5)
(x, y, m, n) = (90, 2, 3, 13)
k=14
for x in range(10*k):
for y in range(k):
for m in range(3,k):
for n in range(3,k):
if (x**m-1)*(y-1)==(y**n-1)*(x-1) and x>y>1:
print(x,y,m,n)
*******************************************************
ビール予想
A, B, C, x, y, z が自然数であり、かつ、x, y, z ≥ 3 であるとき、A^{x}+B^{y}=C^{z}
ならば、A, B, C は共通の素因数を持つ。
import math
import random
k=random.randint(1,6)
m=2
n=10
for a in range(n):
for b in range(n):
for c in range(n):
for x in range(m,n):
for y in range(m,n):
for z in range(m,n):
if (a+k)**x+(b+k)**y==(c+k)**z and x>m and y>m and z>m :
print((a+k),(b+k),(c+k),math.gcd((a+k),math.gcd((b+k),(c+k))))
*******************************************************
フェルマー=カタラン予想
方程式 a^x+b^y=c^z と不等式 1/x+1/y+1/z<1 を同時に満たす自然数の組 (a, b, c, x, y, z) であって、(a, b, c)が
互いに素で、(a^x, b^y, c^z)の値が異なるものは、有限個しか存在しない
(2,5,7,2,3,4,),(7,3,13,2,2,9)(2,7,17,3,71,2),(3,5,11,4,122,2)
import math
import random
i=60
j=random.randint(0,2)
for a in range(1,8):
for b in range(1,18):
for c in range(1,12):
for x in range(1,8):
for y in range(1,5):
for z in range(1,10):
gcd=(math.gcd(a,math.gcd(b,c+i*j)))
eq=a**x+b**y-(c+i*j)**z
if eq==0 and x*y*z>x*y+y*z+z*x and gcd==1 :
print(a,x,b,y,c+i*j,z)
*******************************************************
ルジャンドル予想とは、任意の自然数 n について、n^2 と (n + 1)^2 の間には必ず素数が存在するという予想
である。
import random
# 素数判定関数
def isprime(N):
if N < 2:
return False
i = 2
while i * i <= N:
if N % i == 0:
return False
i += 1
return True
# 入力と判定
N =random.randint(1,19)
# N 以下の素数を探す
result = -1
for p in range(N**2, (N + 1)**2):
if isprime(p):
result = p
break
print(N,N+1)
print(N**2,result, (N + 1)**2)
*******************************************************
カタラン予想(証明済)
次の不定方程式について、x^a − y^b = 1,x, a, y, b > 1 上記を満たす自然数解の組み合わせは
x = 3, a = 2, y = 2, b = 3
n=40
for x in range(2,n):
for a in range(2,n):
for y in range(2,n):
for b in range(2,n):
if x**a-y**b==1:
print(x,a,y,b)
*******************************************************
アンドリカの予想
p_{n}は n 番目の素数である。全ての n について(√p_n+1)-(√p_n)<1 が成り立つ。
import random
# 素数判定関数
def isprime(N):
if N < 2:
return False
i = 2
while i * i <= N:
if N % i == 0:
return False
i += 1
return True
# 入力と判定
N =random.randint(5,900)
# N 以下の素数を探す
for p in range(2, N + 1):
for q in range(2, N + 1):
if isprime(N+p) and isprime(N+p+q) :
a=N+p
b=N+p+q
c =(N+p+q)**(0.5)-(N+p)**(0.5)
break
print(a,b,c)
*******************************************************
ブロカールの問題とは、n!+1=m^{2}を満たす整数の組 (n, m) がいくつ存在するか、という数学の問題である。
(4,5), (5,11), (7,71)
import math
k=100
for m in range(k):
for n in range(k):
if math.factorial(n)+1==m**2 :
print(m,n)
*******************************************************
リーマン予想が正しい場合、以下の式が成り立つことが知られている。|π (x)- li (x)| < (√x)log(x)/8π (x> 2657)
import random
import numpy as np
from scipy import integrate
# 素数判定関数
def isprime(N):
if N < 2:
return False
i = 2
while i * i <= N:
if N % i == 0:
return False
i += 1
return True
n =random.randint(2657,92913)
y = lambda x: 1/(np.log(x))
li, err = integrate.quad(y, 2, n)
a=np.sqrt(n)*np.log(n)/(8*np.pi)
p=0
for q in range(n):
if isprime(q):
p+=1
print(n,p,li,a)
*******************************************************
ラグランジュの四平方定理は、全ての自然数が高々四個の平方数の和で表されることを主張する定理である。
import random
k=random.randint(29,36)
m=2
for a in range(k):
for b in range(k):
for c in range(k):
for d in range(k):
if a**m+b**m+c**m+d**m==k :
print(k,a,b,c,d)
*******************************************************
弱いゴールドバッハ予想(証明済)
7 より大きい奇数は 3 個の素数の和で表せる。
import random
def isprime(N):
if N < 2:
return False
i = 2
while i * i <= N:
if N % i == 0:
return False
i += 1
return True
N =2* random.randint(9,50)+1
# N 以下の素数を探す
result = -1
result2=-1
for p in range(2, N + 1):
for q in range(2, N + 1):
if isprime(p) and isprime(q) and isprime(N-p-q):
result = p
result2=q
break
print(N,result,result2,N-result-result2)
*******************************************************
SIR モデル
i=1
s=100-i
r=0
a=1
b=5
while r<90:
print(i)
x=s*i
s=s-a*x/100
i=(1-b/100)*i+a*x/100
r=r+b*i/100
*******************************************************
ランダムウォーク
import random
x=y=z=t=0
a=random.randint(0,1)
b=random.randint(0,1)
c=100000
print(1+a+b)
for n in range(c):
t+=1
x+=(-1)**random.randint(0,1)
y+=a*(-1)**random.randint(0,1)
z+=b*(-1)**random.randint(0,1)
if a+b==0 or (a+b==1 and t<10) or t%(c//10)==1:
print(x,y,z,end=' , ')
if x==0 and y==0 and z==0:
break
print()
print(x,y,z)
print(t)
*******************************************************
ライプニッツの円周率公式
x=0
for y in range(5000000):
x+=((-1)**y)/(2*y+1)
print(4*x)
*******************************************************
ラマヌジャンの円周率公式
import math
x=0
for y in range(3):
x+=math.factorial(4*y)*(1103+26390*y)/(((4*99)**y*math.factorial(y))**4)
print(1/(2*(2**(0.5))*x/(99**2)))
print(math.pi)
*******************************************************
オイラー予想の反例
n = 5 の場合の反例として解 (27, 84, 110, 133, 144)
for a in range(20,30):
for b in range(80,90):
for c in range(105,115):
for d in range(130,140):
for e in range(140,150):
if a**5+b**5+c**5+d**5==e**5:
print(a,b,c,d,e)
*******************************************************
分割数
は自然数 n の分割の総数を表す数論的函数である。
import random
import math
k=random.randint(2,19)
def partition(n):
table = [1] * (n + 1)
for k in range(2, n + 1):
for m in range(k, n + 1):
table[m] += table[m - k]
return table[n]
x=(math.e**(math.pi*((2*k/3)**(0.5))))/(4*k*(3**(0.5)))
print(k,partition(k),x,partition(k)/x)
*******************************************************
ラマヌジャン・スコーレムの定理
2**n − 7 = x**2 の自然数解は (n, x) = (3, 1), (4, 3), (5, 5), (7, 11), (15, 181) のときだけであるというもの
import random
k=200
m =2**random.randint(2,4)-1
print(m)
for n in range(1,k):
for x in range(1,k):
if 2**n-m==x**2 :
print(n,x)
*******************************************************
ロトカ・ヴォルテラの方程式
ここで x は被食者の個体数、 y は捕食者の個体数、t は時間をあらわし、4 つの係数 a, b, c, d は正の実数の
パラメータである。
import random
x=50
y=50
a=1+random.randint(10,90)/1000
b=-random.randint(10,90)/10000
c=1+random.randint(10,90)/10000
d=random.randint(10,90)/100000
for i in range(10):
print(x,y)
k=x*y
x=a*x+b*k
y=c*y+d*k
*******************************************************
タクシー数(Ruby: https://qiita.com/yosaprog/items/f6fdb9c9d3c6401450ce)
n 番目のタクシー数とは、2 つの立方数の和として n 通りに表される最小の正の整数と定義される。
def safe_invert(orig_hash)
orig_hash.each_key.group_by { |key| orig_hash[key] }.sort.to_h
end
hash = {}
(1..500).each do |y|
(1..500).each do |x|
hash.store([x, y], x ** 3 + y ** 3)
if x == y
break
end
end
end
taxi = []
n = 1
safe_invert(hash).each do |k, v|
if v.size == n
taxi.push("Ta(#{n}) => #{k}: #{v}")
n += 1
end
end
puts taxi
*******************************************************
ポリア予想
リウヴィル関数λ(n)を使うと予想は次のように言い換えられる。
『任意の自然数 n > 1 に対しΣλ(k)<=0』
n=p_1^(a_1)・・・p_k^(a_k)
Ω(n)=a_1+・・・+a_k
λ(n)=(-1)^ Ω(n)
import math
import random
from collections import Counter
# 素因数分解を行う関数
def prime_factorization(n):
# Counter クラスを呼び出してオブジェクト生成
counter = Counter()
# 素数で割り切れるかの判定
for p in range(2, int(N ** 0.5) + 1):
# 1回割り切れるごとに+1 カウントしていく
while n % p == 0:
counter[p] += 1
n //= p
# n が 1 より大きい数字として残っていれば、素数
if n != 1:
counter[n] += 1
return counter
k = random.randint(15,33)
n=0
print(k)
for N in range(2, k):
result = prime_factorization(N)
tot = 0
for key, value in result.items():
#for i in range(value):
# print(key, end = " ")
tot += value
m=(-1)**tot
print(tot, end = " ")
n+=m
print()
print(n)
*******************************************************
蔵本モデル
import random
import math
n=7
x = [0] * n
for k in range(n):
x[k] =random.random()/7
print(x)
u = [0] * n
for k in range(n):
u[k] =5*random.random()
print(u)
T=100000
for t in range(T):
for k in range(n):
for m in range(n-1):
u[k] +=x[k]+0.1*math.sin(u[m]-u[k])
if t%(T//5)==0:
print(u)
*******************************************************
#スピン系?
import random
n=10
T=70000
u =x= [0] * n
y=z=0
for t in range(T):
for k in range(n):
u[k] =(-1)**random.randint(0,1)
for m in range(1,n):
y+=u[k-1]*u[k]
if y<z:
x=u
z=y
y=0
if t%(T/10)==0:
print(x)
*******************************************************
タネルの定理/バーチ・スウィンナートン=ダイアー予想(未完成)
5, 6, 7, 13, 14, 15, 20, 21, 22, 23, 24, 28, 29, 30, 31, 34, 37, 38, 39, 41, 45, 46, 47, 52, 53, 54, 55, 56, 60, 61, 62,
63, 65, 69, 70, 71, 77, 78, 79, 80, 84, 85, 86, 87, 88, 92, 93, 94, 95, 96, 101, 102, 103, 109, 110, 111, 112, 116,
117, 118, 119, 120
import math
import random
for n in range(1,30):
m=2
a=b=c=d=0
for x in range(n):
for y in range(n):
for z in range(n):
if 2*x**m+y**m+32*z**m==n :
a+=1
if 2*x**m+y**m+8*z**m==n :
b+=1
if 8*x**m+2*y**m+64*z**m==n :
c+=1
if 8*x**m+2*y**m+16*z**m==n :
d+=1
if round(n**0.5)==n**0.5:
e=1
else:
if n%2==0:
e=2*c-d
else:
e=2*a-b
if e==0:
print(n)
*******************************************************
ランダー・パーキン・セルフリッジ予想(未完成)
{¥displaystyle ¥sum _{i=1}^{n}a_{i}^{k}=¥sum _{j=1}^{m}b_{j}^{k}} が自然数 ai ≠ bj ( 1 ≤ i ≤ n 、1 ≤ j ≤
m)に対して成立する時、 m+n ≥ k となる。
*******************************************************
#箱玉系(未完成)
import random
n=50#
u = [0] * n
for k in range(0,n):
u[k] =random.randint(0,1)
print(u)
x = [0] * n
for t in range(0,10):
for k in range(0,n):
y=0
for m in range(0,k-1):
y+=(u[m]+x[m])
x[k] =min([1-u[k],y])
print(x)
u=x
x= [0] * n
*******************************************************