import sympy as sp
def d(m, p):
"""Retourne d(m) = plus petit multiple de 4m-1 strictement supérieur à
mp, moins mp."""
q = 4*m - 1
k = (m * p) // q + 1
return k * q - m * p
def condition(m, p):
"""True si d(m) divise m ou m^2."""
val = d(m, p)
if val == 0:
return False
return (m % val == 0) or ((m*m) % val == 0)
def has_divisor_3k_minus_1(c):
"""Vrai si c a un diviseur de la forme 3k-1 (i.e. un facteur premier ≡ 2
mod 3)."""
# On teste les petits diviseurs, puis on décompose
if c == 1:
return False
# On teste d'abord les petits nombres
for d in
[2,5,11,17,23,29,41,47,53,59,71,83,89,101,107,113,131,137,149,167,173,
179,191,197]:
if d*d > c:
break
if c % d == 0:
if d % 3 == 2:
return True
while c % d == 0:
c //= d
if c > 1 and c % 3 == 2:
return True
return False
def has_bad_factor_mod7(N):
"""Vrai si N a un facteur premier congru à 3,5,6 modulo 7."""
# On teste les petits facteurs
for p in
[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97]
:
if p*p > N:
break
if N % p == 0:
if p % 7 in (3,5,6):
return True
while N % p == 0:
N //= p
if N > 1 and N % 7 in (3,5,6):
return True
return False
def is_chaotic(p):
"""Vrai si p est dans le cas résiduel (ni linéaire, ni transitoire)."""
if p % 4 != 1:
return False
c = (p + 3) // 4
N=c+1
# Linéaire : c a un diviseur 3k-1
if has_divisor_3k_minus_1(c):
return False
# Transitoire : N a un facteur premier ≡ 3,5,6 mod7
if has_bad_factor_mod7(N):
return False
return True
# Paramètres
k_max = 5000 # On teste p = 120k+49 pour k jusqu'à cette borne
max_m_var = 20 # On cherche un m (variable) <= 20
found = []
for k in range(0, k_max):
p = 120*k + 49
if p < 2:
continue
if [Link](p):
if is_chaotic(p):
# Cherche le plus petit m (1..max_m_var) qui vérifie condition
best_m = None
for m_var in range(1, max_m_var+1):
if condition(m_var, p):
best_m = m_var
break
if best_m is not None:
[Link]((p, best_m, d(best_m, p)))
if len(found) >= 20:
break
print("Nombres premiers chaotiques (p = 120k+49) et leur plus petit m ≤
20 :")
for p, m, d_val in found:
print(f"p={p}, m={m}, d={d_val} (divise {m} ou {m}^2)")