| Termo | Definição |
|---|---|
| LHA | Lei posicional para decisão de primalidade a partir de filtros de wheel e testes modulares por dígitos. |
| Wheel M | Filtro por resíduos coprimos (recomendado M=210), elimina múltiplos triviais antes do teste posicional. |
| Sp(n) | Resto posicional: computa n mod p via Horner sobre os dígitos, sem divisão direta de n por p. |
| k, B(k) | k = nº de dígitos de n; B(k) = 10^⌈k/2⌉ é o limite superior para os primos testados (cobre √n na prova). |
| Pk | Conjunto de primos p ≤ B(k); se nenhum p∈Pk divide n (e n≠p), então n é primo. |
| DMFP⁺ | Conjunto curto de primos para veto rápido (ex.: {{3,5,7,11,13,17,19,23}}) — usado em U_dir+. |
| GSR | Escore por “fechamentos” em offsets (±2, ±4, ±6, ±8, ±10) — usado no U_dir+. |
| RDN, RD3, RD9 | Raiz Digital (base 10), e assinaturas modulares por 3 e por 9. Ex.: RD9(n)=1+((n−1) mod 9). |
Postulado P1 (Cobertura por magnitude):
Para n com k dígitos, defina B(k) = 10^⌈k/2⌉ e P_k = {{ p primo | p ≤ B(k) }}.
Se ∀ p∈P_k: S_p(n) ≠ 0 (e n ≠ p), então n é primo.
Esboço da prova:
Todo composto n=ab tem um fator primo ≤ √n. Como √n ≤ 10^{k/2} ≤ 10^⌈k/2⌉, então
esse fator primo pertence a P_k. Logo, se nenhum p∈P_k divide n, n não tem fatores
primos ≤ √n, portanto é primo.
Observação: √n não é computado no algoritmo; aparece apenas na justificativa teórica.
isPrime_Uuni(n):
if n < 2: return False
if n in {{2,3,5,7}}: return True
// Wheel forte
M = 210; if (n % M) ∉ Res(M): return False
k = número_de_dígitos(n); B = 10^ceil(k/2)
P_k = {{primos p | p ≤ B}} // cache por k
para p em P_k:
if S_p(n) == 0 and n != p: return False
return True
from math import gcd, isqrt
def primes_upto(n):
bs = bytearray(b"\x01")*(n+1)
bs[0:2] = b"\x00\x00"
p=2
while p*p<=n:
if bs[p]:
bs[p*p:n+1:p] = b"\x00"*(((n-p*p)//p)+1)
p+=1
return [i for i,b in enumerate(bs) if b]
def Spos(n,p):
s=0
for ch in str(n): s=(s*10+ord(ch)-48)%p
return s
def U_uni(n):
if n<2: return False
if n in (2,3,5,7): return True
M=210
if gcd(n,M)!=1: return False
k=len(str(n)); B=10**((k+1)//2)
for p in primes_upto(B):
if n!=p and Spos(n,p)==0: return False
return True
def auditor(n):
if n<2: return False
if n%2==0: return n==2
for p in range(3,isqrt(n)+1,2):
if n%p==0: return n==p
return True
Wheel M=210; DMFP⁺ = {{3,5,7,11,13,17,19,23}}; escore GSR em offsets ±2/±4/±6/±8/±10 com limiar τ=4. Reporte métricas por faixas de 100k e amostras de FP/FN.