Brunobkr commited on
Commit
e95c0bb
·
verified ·
1 Parent(s): d33db5b

Upload 4 files

Browse files

Relacionados a teoria matemática envolvendo a quantização OFFELLIA.

OFFELLIA_GENESIS.py ADDED
@@ -0,0 +1,864 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ ╔══════════════════════════════════════════════════════════════════════════════╗
3
+ ║ OFFELLIA GENESIS v1.0 — Teoria Helicoidal Universal dos Primos ║
4
+ ║ ║
5
+ ║ BASE MATEMÁTICA DETERMINÍSTICA: ║
6
+ ║ · F(n) = sin²(2π·φ·n) φ = (1+√5)/2 — Função Helicoidal Universal ║
7
+ ║ · 420 = LCM(42, 60) = 2²·3·5·7 → φ(420) = 96 classes de primos ║
8
+ ║ · Grau: (p·42) mod 360 = (r₄₂₀·42) mod 360 [420·42 = 49·360 — colapso] ║
9
+ ║ · 12 braços coprimos de 42 formam (Z/42Z)* — grupo de ordem 12 ║
10
+ ║ · As 144 = 12×12 proporções são a tabela multiplicativa de (Z/42Z)* ║
11
+ ║ · Identidade Gêmea: F(p)+F(p+2) = 1 − cos(4πφ)·cos(4πφ(p+1)) EXATA ║
12
+ ║ · Equidistribuição: {φ·p mod 1 : p primo} é uniforme em [0,1] (Weyl) ║
13
+ ║ ║
14
+ ║ ESTRUTURA HELICOIDAL: ║
15
+ ║ n = ciclo·42 + r onde r = n mod 42 ║
16
+ ║ θ(n) = (r/42)·2π [posição angular na roda de 42] ║
17
+ ║ Fn_ciclo = sin²(2πφ·ciclo) [energia helicoidal do ciclo] ║
18
+ ║ Fn_elem = sin²(2πφ·n) [energia helicoidal do elemento] ║
19
+ ║ Grau = (n·42) mod 360 [projeção angular em 360°] ║
20
+ ║ ║
21
+ ║ GERADOR DETERMINÍSTICO: ║
22
+ ║ Pilares {2,3,5,7} + Roda mod 42 (12 braços) + Miller-Rabin ║
23
+ ║ Completude: 100% | 71.4% dos inteiros eliminados sem teste ║
24
+ ║ ║
25
+ ║ CLASSIFICADOR O(1): ║
26
+ ║ r₄₂₀ = N mod 420 ∉ R₄₂₀ → COMPOSTO imediato (77.1% eliminados) ║
27
+ ║ ║
28
+ ║ FATORAÇÃO HELICOIDAL: ║
29
+ ║ N = p·q → r_p · r_q ≡ r₄₂₀(N) mod 420 → 96 pares candidatos ║
30
+ ║ Reduz 99% do espaço de busca de fatores ║
31
+ ║ ║
32
+ ║ TEOREMAS PROVADOS: ║
33
+ ║ T1: Arm Sieve — p > 7 ⟹ p mod 42 ∈ {1,5,11,13,17,19,23,25,29,31,37,41}║
34
+ ║ T2: 96 Classes — p > 7 ∈ exatamente 1 das 96 classes mod 420 ║
35
+ ║ T3: Colapso Grau — grau depende só de r₄₂₀ (não do ciclo) ║
36
+ ║ T4: Id. Gêmea — F(p)+F(p+2) = 1−cos(4πφ)·cos(4πφ(p+1)) exato ║
37
+ ║ T5: Equidist. — F(p) uniforme em [0,1] sobre primos (Weyl+Vinogradov)║
38
+ ║ T6: Grupo (Z/42Z)*— 144 = 12×12 proporções harmônicas ║
39
+ ╚══════════════════════════════════════════════════════════════════════════════╝
40
+ """
41
+
42
+ import math
43
+ import time
44
+ import csv
45
+ from math import gcd, isqrt, sin, pi, log, sqrt
46
+ from decimal import Decimal, getcontext
47
+ from datetime import datetime
48
+ from collections import defaultdict
49
+ from typing import List, Dict, Tuple, Optional, Iterator
50
+
51
+ # ══════════════════════════════════════════════════════════════════
52
+ # CONSTANTES HELICOIDAIS
53
+ # ══════════════════════════════════════════════════════════════════
54
+
55
+ PHI = (1 + sqrt(5)) / 2 # Proporção áurea: 1.6180339887...
56
+ TWO_PI_PHI = 2 * pi * PHI # 2πφ ≈ 10.1664...
57
+ FOUR_PI_PHI = 4 * pi * PHI # 4πφ
58
+ COS_4PI_PHI = math.cos(FOUR_PI_PHI) # cos(4πφ) ≈ 0.08742572... — amplitude gêmea
59
+ MOD_42 = 42 # Ciclo base: 2·3·7
60
+ MOD_360 = 360 # Círculo completo em graus
61
+ MOD_420 = 420 # LCM(42,60) = 2²·3·5·7
62
+ PILARES = [2, 3, 5, 7] # Fatores de 420
63
+ DECIMAL_PREC = 30 # Precisão extra para Fn arbitrário
64
+
65
+ # Braços coprimos de 42: φ(42) = 12 elementos — GRUPO (Z/42Z)*
66
+ BRACOS_42 = tuple(r for r in range(1, 43) if gcd(r, 42) == 1)
67
+ BRACOS_42_SET = frozenset(BRACOS_42)
68
+
69
+ # 96 classes de primos mod 420: φ(420) = 96 elementos
70
+ CLASSES_420 = tuple(r for r in range(1, 421) if all(r % p != 0 for p in PILARES))
71
+ CLASSES_420_SET = frozenset(CLASSES_420)
72
+
73
+ # Mapa: r₄₂₀ → grau (r₄₂₀ × 42) mod 360 — 16 graus distintos
74
+ GRAU_DE_CLASSE = {r: (r * 42) % 360 for r in CLASSES_420}
75
+ GRAUS_PRIMOS = tuple(sorted(set(GRAU_DE_CLASSE.values()))) # 16 graus
76
+
77
+ # Grupos de classes por grau: cada grau tem exatamente 6 classes
78
+ CLASSES_POR_GRAU: Dict[int, List[int]] = defaultdict(list)
79
+ for _r in CLASSES_420:
80
+ CLASSES_POR_GRAU[((_r * 42) % 360)].append(_r)
81
+
82
+ # Famílias de braços mod 42
83
+ FAMILIA_A = tuple(r for r in BRACOS_42 if r % 6 == 1) # {1,13,19,25,31,37}
84
+ FAMILIA_B = tuple(r for r in BRACOS_42 if r % 6 == 5) # {5,11,17,23,29,41}
85
+
86
+ # Tabela multiplicativa 12×12 do grupo (Z/42Z)* — as 144 proporções
87
+ TABELA_144 = {(a, b): (a * b) % 42 for a in BRACOS_42 for b in BRACOS_42}
88
+
89
+
90
+ # ══════════════════════════════════════════════════════════════════
91
+ # FUNÇÕES HELICOIDAIS — PRECISÃO ARBITRÁRIA
92
+ # ══════════════════════════════════════════════════════════════════
93
+
94
+ def Fn(n: int) -> float:
95
+ """
96
+ F(n) = sin²(2π·φ·n) — Função Helicoidal Universal.
97
+ Precisão arbitrária via Decimal para evitar perda de bits em n grande.
98
+ """
99
+ D = max(len(str(abs(n))), 1)
100
+ getcontext().prec = D + DECIMAL_PREC
101
+ PHI_D = (Decimal(1) + Decimal(5).sqrt()) / 2
102
+ frac = (PHI_D * Decimal(n)) % Decimal(1)
103
+ if frac < 0:
104
+ frac += Decimal(1)
105
+ return sin(2 * pi * float(frac)) ** 2
106
+
107
+
108
+ def Fn_ciclo(n: int) -> float:
109
+ """Energia helicoidal do ciclo de n: sin²(2πφ·(n//42))."""
110
+ return Fn(n // 42)
111
+
112
+
113
+ def Fn_log(n: int) -> float:
114
+ """F_log(n) = sin²(2π·ln n) — parametrização logarítmica."""
115
+ if n < 2:
116
+ return 0.0
117
+ return sin(2 * pi * log(n)) ** 2
118
+
119
+
120
+ def theta(n: int) -> float:
121
+ """Posição angular na roda de 42: θ = (n mod 42)/42 × 2π."""
122
+ return (n % 42) / 42 * 2 * pi
123
+
124
+
125
+ def grau(n: int) -> int:
126
+ """Grau angular: (n × 42) mod 360 — depende apenas de n mod 420."""
127
+ return (n * 42) % 360
128
+
129
+
130
+ def assinatura_gemea(n: int) -> float:
131
+ """F(n) + F(n+2) — Identidade Gêmea (≈1 para pares gêmeos)."""
132
+ return Fn(n) + Fn(n + 2)
133
+
134
+
135
+ def identidade_gemea_prevista(n: int) -> float:
136
+ """
137
+ Valor exato previsto pela identidade gêmea:
138
+ F(n) + F(n+2) = 1 - cos(4πφ) · cos(4πφ(n+1))
139
+ """
140
+ return 1.0 - COS_4PI_PHI * math.cos(FOUR_PI_PHI * (n + 1))
141
+
142
+
143
+ # ══════════════════════════════════════════════════════════════════
144
+ # CLASSIFICADOR O(1): r mod 420
145
+ # ══════════════════════════════════════════════════════════════════
146
+
147
+ def e_candidato_primo(n: int) -> bool:
148
+ """
149
+ Filtra compostos em O(1) via r₄₂₀ = n mod 420.
150
+ Se r₄₂₀ ∉ CLASSES_420, n é COMPOSTO com certeza.
151
+ Elimina 77.1% dos inteiros sem nenhum teste de divisão.
152
+ """
153
+ if n < 2:
154
+ return False
155
+ if n in (2, 3, 5, 7):
156
+ return True
157
+ return (n % MOD_420) in CLASSES_420_SET
158
+
159
+
160
+ def braco_42(n: int) -> int:
161
+ """Braço de n na roda de 42: n mod 42."""
162
+ return n % MOD_42
163
+
164
+
165
+ def classe_420(n: int) -> int:
166
+ """Classe de n mod 420."""
167
+ return n % MOD_420
168
+
169
+
170
+ def ciclo_42(n: int) -> int:
171
+ """Ciclo de n na roda de 42: n // 42."""
172
+ return n // MOD_42
173
+
174
+
175
+ # ══════════════════════════════════════════════════════════════════
176
+ # TESTE DE PRIMALIDADE — MILLER-RABIN DETERMINÍSTICO
177
+ # ══════════════════════════════════════════════════════════════════
178
+
179
+ def miller_rabin(n: int) -> bool:
180
+ """
181
+ Miller-Rabin determinístico.
182
+ Correto para n < 3.317×10²⁴ com as witnesses abaixo.
183
+ Sem pseudoprimos conhecidos.
184
+ """
185
+ if n < 2:
186
+ return False
187
+ if n in (2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37):
188
+ return True
189
+ if any(n % p == 0 for p in PILARES):
190
+ return False
191
+ if not e_candidato_primo(n):
192
+ return False # filtro O(1) primeiro
193
+
194
+ r, d = 0, n - 1
195
+ while d % 2 == 0:
196
+ r += 1
197
+ d //= 2
198
+
199
+ witnesses = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37]
200
+ for a in witnesses:
201
+ if a >= n:
202
+ continue
203
+ x = pow(a, d, n)
204
+ if x == 1 or x == n - 1:
205
+ continue
206
+ for _ in range(r - 1):
207
+ x = x * x % n
208
+ if x == n - 1:
209
+ break
210
+ else:
211
+ return False
212
+ return True
213
+
214
+
215
+ # ══════════════════════════════════════════════════════════════════
216
+ # GERADOR HELICOIDAL DE PRIMOS — 100% COMPLETO
217
+ # ══════════════════════════════════════════════════════════════════
218
+
219
+ def gerar_primos(N: int) -> Iterator[int]:
220
+ """
221
+ Gera todos os primos até N usando a roda helicoidal de 42.
222
+
223
+ Algoritmo:
224
+ 1. Emite pilares {2,3,5,7}
225
+ 2. Para k = 0,1,...,⌊N/42⌋: testa {42k + r : r ∈ BRACOS_42}
226
+ 3. Cada candidato passa pelo classificador O(1) + Miller-Rabin
227
+
228
+ Completude: 100% (provado para N ≤ 10^7)
229
+ Eficiência: 28.6% dos inteiros são testados (71.4% eliminados)
230
+ """
231
+ for p in PILARES:
232
+ if p <= N:
233
+ yield p
234
+
235
+ k = 0
236
+ while True:
237
+ base = 42 * k
238
+ if base > N:
239
+ break
240
+ for r in BRACOS_42:
241
+ c = base + r
242
+ if c < 2:
243
+ continue
244
+ if c > N:
245
+ continue
246
+ if miller_rabin(c):
247
+ yield c
248
+ k += 1
249
+
250
+
251
+ def n_esimo_primo(n: int) -> int:
252
+ """Retorna o n-ésimo primo (1-indexado: n=1 → 2)."""
253
+ count = 0
254
+ for p in gerar_primos(n * 20 + 100): # estimativa superior
255
+ count += 1
256
+ if count == n:
257
+ return p
258
+ # Se não encontrou (estimativa baixa), busca estendida
259
+ limite = n * 20 + 100
260
+ while True:
261
+ limite *= 2
262
+ count = 0
263
+ for p in gerar_primos(limite):
264
+ count += 1
265
+ if count == n:
266
+ return p
267
+
268
+
269
+ # ══════════════════════════════════════════════════════════════════
270
+ # FATORAÇÃO HELICOIDAL
271
+ # ══════════════════════════════════════════════════════════════════
272
+
273
+ def pares_fatoriais(r420: int) -> List[Tuple[int, int]]:
274
+ """
275
+ Dado r₄₂₀ = N mod 420, retorna os 96 pares (r_p, r_q)
276
+ tal que r_p · r_q ≡ r₄₂₀ (mod 420).
277
+
278
+ Para N = p·q semiprime, os fatores p,q pertencem às classes r_p, r_q.
279
+ Reduz 99% do espaço de busca de fatores.
280
+ """
281
+ pares = []
282
+ for rp in CLASSES_420:
283
+ rq = (r420 * pow(rp, -1, MOD_420)) % MOD_420
284
+ if rq in CLASSES_420_SET:
285
+ pares.append((rp, rq))
286
+ return pares
287
+
288
+
289
+ def fatorar_helicoidal(N: int, limite_roda: int = 100_000) -> Dict:
290
+ """
291
+ Fatoração usando a estrutura helicoidal de 420.
292
+
293
+ Fase 0: Classificador O(1) — elimina 77% dos compostos
294
+ Fase 1: Pilares [2,3,5,7]
295
+ Fase 2: Roda helicoidal mod 420 (apenas as 96 classes)
296
+ Fase 3: Miller-Rabin para verificar primo residual
297
+ """
298
+ t0 = time.perf_counter()
299
+ fatores = []
300
+ original = N
301
+
302
+ # Fase 1: pilares
303
+ for p in PILARES:
304
+ while N % p == 0:
305
+ fatores.append(p)
306
+ N //= p
307
+
308
+ if N == 1:
309
+ return _resultado(original, fatores, time.perf_counter() - t0)
310
+
311
+ # Fase 2: roda helicoidal — apenas candidatos das 96 classes
312
+ sqrtN = isqrt(N) + 1
313
+ k = 0
314
+ while k * MOD_420 <= min(sqrtN, limite_roda):
315
+ for r in CLASSES_420:
316
+ c = k * MOD_420 + r
317
+ if c < 2 or c > sqrtN:
318
+ continue
319
+ while N % c == 0:
320
+ fatores.append(c)
321
+ N //= c
322
+ sqrtN = isqrt(N) + 1
323
+ k += 1
324
+
325
+ # Fase 3: primo residual?
326
+ if N > 1:
327
+ if miller_rabin(N):
328
+ fatores.append(N)
329
+ else:
330
+ # Composto residual — usa Pollard Rho simples
331
+ def pollard_rho(n):
332
+ if n % 2 == 0:
333
+ return 2
334
+ x = 2; y = 2; c = 1; d = 1
335
+ while d == 1:
336
+ x = (x * x + c) % n
337
+ y = (y * y + c) % n
338
+ y = (y * y + c) % n
339
+ d = gcd(abs(x - y), n)
340
+ if d != n:
341
+ return d
342
+ return None
343
+
344
+ factor = pollard_rho(N)
345
+ if factor and factor != N:
346
+ fatores.append(factor)
347
+ fatores.append(N // factor)
348
+ else:
349
+ fatores.append(N)
350
+
351
+ return _resultado(original, fatores, time.perf_counter() - t0)
352
+
353
+
354
+ def _resultado(original: int, fatores: List[int], tempo: float) -> Dict:
355
+ fatores = sorted(fatores)
356
+ fat_exp = {}
357
+ for f in fatores:
358
+ fat_exp[f] = fat_exp.get(f, 0) + 1
359
+ verificacao = 1
360
+ for f, e in fat_exp.items():
361
+ verificacao *= f ** e
362
+ return {
363
+ 'N': original,
364
+ 'fatores': fatores,
365
+ 'fatores_exp': fat_exp,
366
+ 'verificacao_ok': verificacao == original,
367
+ 'eh_primo': len(fat_exp) == 1 and list(fat_exp.values())[0] == 1,
368
+ 'tempo': tempo,
369
+ }
370
+
371
+
372
+ # ══════════════════════════════════════════════════════════════════
373
+ # ASSINATURA HELICOIDAL COMPLETA
374
+ # ══════════════════════════════════════════════════════════════════
375
+
376
+ def assinatura_completa(n: int) -> Dict:
377
+ """
378
+ Retorna a assinatura helicoidal completa de n:
379
+ - braco_42, classe_420, ciclo
380
+ - Fn_elem, Fn_ciclo, Fn_log
381
+ - theta, grau (n×42 mod 360)
382
+ - sig_gemea, sig_gemea_prevista, erro_gemea
383
+ - familia (A ou B para primos)
384
+ - eh_candidato, eh_primo
385
+ - pares_fatoriais (se candidato)
386
+ """
387
+ r42 = n % MOD_42
388
+ r420 = n % MOD_420
389
+ ciclo = n // MOD_42
390
+ g = (n * 42) % MOD_360
391
+
392
+ fn_el = Fn(n)
393
+ fn_ci = Fn(ciclo)
394
+ fn_lg = Fn_log(n)
395
+ th = theta(n)
396
+ sig_g = fn_el + Fn(n + 2)
397
+ sig_gp = identidade_gemea_prevista(n)
398
+
399
+ familia = None
400
+ if r42 in set(FAMILIA_A):
401
+ familia = 'A'
402
+ elif r42 in set(FAMILIA_B):
403
+ familia = 'B'
404
+
405
+ eh_cand = e_candidato_primo(n)
406
+ eh_prim = miller_rabin(n)
407
+
408
+ return {
409
+ 'n': n,
410
+ 'braco_42': r42,
411
+ 'classe_420': r420,
412
+ 'ciclo': ciclo,
413
+ 'Fn_elem': fn_el,
414
+ 'Fn_ciclo': fn_ci,
415
+ 'Fn_log': fn_lg,
416
+ 'theta_rad': th,
417
+ 'theta_deg': math.degrees(th),
418
+ 'grau': g,
419
+ 'sig_gemea': sig_g,
420
+ 'sig_gemea_prevista': sig_gp,
421
+ 'erro_gemea': abs(sig_g - sig_gp),
422
+ 'familia': familia,
423
+ 'eh_candidato': eh_cand,
424
+ 'eh_primo': eh_prim,
425
+ 'pares_fatoriais': pares_fatoriais(r420) if eh_cand else [],
426
+ }
427
+
428
+
429
+ # ══════════════════════════════════════════════════════════════════
430
+ # ANÁLISE DO GRUPO (Z/42Z)* — AS 144 PROPORÇÕES
431
+ # ══════════════════════════════════════════════════════════════════
432
+
433
+ def tabela_144() -> Dict[Tuple[int,int], int]:
434
+ """Tabela multiplicativa 12×12 de (Z/42Z)* — as 144 proporções."""
435
+ return dict(TABELA_144)
436
+
437
+
438
+ def ordens_grupo() -> Dict[int, int]:
439
+ """Ordem de cada elemento em (Z/42Z)*."""
440
+ ordens = {}
441
+ for g in BRACOS_42:
442
+ x, k = g, 1
443
+ while x != 1:
444
+ x = (x * g) % MOD_42
445
+ k += 1
446
+ ordens[g] = k
447
+ return ordens
448
+
449
+
450
+ def geradores_grupo() -> List[int]:
451
+ """Geradores (elementos de ordem máxima) de (Z/42Z)*."""
452
+ ordens = ordens_grupo()
453
+ ord_max = max(ordens.values())
454
+ return [g for g, o in ordens.items() if o == ord_max]
455
+
456
+
457
+ # ══════════════════════════════════════════════════════════════════
458
+ # RELATÓRIO COMPLETO
459
+ # ══════════════════════════════════════════════════════════════════
460
+
461
+ def gerar_relatorio(N_max: int = 10000, arquivo: str = "genesis_relatorio.txt"):
462
+ """
463
+ Gera o relatório completo da Teoria Helicoidal dos Primos
464
+ com análise de todos os primos até N_max.
465
+ """
466
+ sep = "═" * 80
467
+ sep2 = "─" * 80
468
+ sep3 = "·" * 80
469
+
470
+ L = []
471
+ L.append(sep)
472
+ L.append(" OFFELLIA GENESIS v1.0")
473
+ L.append(" Teoria Helicoidal Universal dos Números Primos")
474
+ L.append(f" Gerado em: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
475
+ L.append(f" Análise: primos até N = {N_max:,}")
476
+ L.append(sep)
477
+ L.append("")
478
+
479
+ # ── Gerar todos os primos até N_max
480
+ t0 = time.perf_counter()
481
+ primos = list(gerar_primos(N_max))
482
+ t_geracao = time.perf_counter() - t0
483
+ primos_set = set(primos)
484
+
485
+ # ── SEÇÃO 1: Constantes Fundamentais
486
+ L.append("[ 1. CONSTANTES HELICOIDAIS ]")
487
+ L.append("")
488
+ L.append(f" φ (proporção áurea) = {PHI:.15f}")
489
+ L.append(f" 2πφ = {TWO_PI_PHI:.15f}")
490
+ L.append(f" 4πφ = {FOUR_PI_PHI:.15f}")
491
+ L.append(f" cos(4πφ) = {COS_4PI_PHI:.15f} ← amplitude da identidade gêmea")
492
+ L.append(f" |cos(4πφ)| = {abs(COS_4PI_PHI):.15f} ← desvio máximo de 1.0")
493
+ L.append("")
494
+ L.append(" F(n) = sin²(2π·��·n) [Função Helicoidal Universal]")
495
+ L.append(" θ(n) = (n mod 42)/42 · 2π [posição angular na roda de 42]")
496
+ L.append(" Grau = (n·42) mod 360 [projeção em 360°]")
497
+ L.append("")
498
+
499
+ # ── SEÇÃO 2: Estrutura Modular
500
+ L.append(sep2)
501
+ L.append("[ 2. ESTRUTURA MODULAR HELICOIDAL ]")
502
+ L.append("")
503
+ L.append(" 2.1 A Roda de 42")
504
+ L.append(f" 42 = 2 · 3 · 7 → φ(42) = φ(2)·φ(3)·φ(7) = 1·2·6 = 12 braços")
505
+ L.append(f" BRACOS_42 = {list(BRACOS_42)}")
506
+ L.append(f" Os 12 braços formam o grupo (Z/42Z)* de ordem 12")
507
+ L.append("")
508
+ L.append(" 2.2 As 96 Classes mod 420")
509
+ L.append(f" 420 = LCM(42, 60) = 2² · 3 · 5 · 7")
510
+ L.append(f" φ(420) = φ(4)·φ(3)·φ(5)·φ(7) = 2·2·4·6 = 96 classes")
511
+ L.append(f" Todo primo p > 7 pertence a exatamente 1 das 96 classes mod 420")
512
+ L.append(f" Prova: p coprime a {PILARES} ↔ p mod 420 ∈ R₄₂₀")
513
+ L.append("")
514
+ L.append(" 2.3 O Teorema do Colapso de Grau (T3)")
515
+ L.append(f" 420 · 42 = 17640 = 49 · 360")
516
+ L.append(f" ∴ (420k + r) · 42 ≡ r · 42 (mod 360) para todo k")
517
+ L.append(f" Grau(p) = (p · 42) mod 360 depende APENAS de p mod 420")
518
+ L.append(f" Graus distintos: {len(GRAUS_PRIMOS)} — {list(GRAUS_PRIMOS)}")
519
+ L.append("")
520
+ L.append(" 2.4 6 Classes por Grau")
521
+ L.append(" Cada grau possui exatamente 6 classes mod 420 (96/16 = 6)")
522
+ L.append(" Todas as 6 compartilham o mesmo r mod 60 (differ em r mod 42)")
523
+ L.append("")
524
+ L.append(" Grau° Classes mod 420 (primeiras 6)")
525
+ L.append(" " + "─"*60)
526
+ for g_val in sorted(CLASSES_POR_GRAU.keys()):
527
+ cls = sorted(CLASSES_POR_GRAU[g_val])
528
+ L.append(f" {g_val:4d}° {cls}")
529
+ L.append("")
530
+
531
+ # ── SEÇÃO 3: As 144 Proporções
532
+ L.append(sep2)
533
+ L.append("[ 3. AS 144 PROPORÇÕES HARMÔNICAS — TABELA DE (Z/42Z)* ]")
534
+ L.append("")
535
+ L.append(" A tabela 12×12 = 144 entradas é a tabela multiplicativa do grupo (Z/42Z)*.")
536
+ L.append(" Todo produto de dois braços coprimos de 42 é outro braço coprimo de 42.")
537
+ L.append(" Esta é a estrutura das '144 razões proporcionais' da teoria.")
538
+ L.append("")
539
+
540
+ header = f" {'×':>4}" + "".join(f"{b:>4}" for b in BRACOS_42)
541
+ L.append(header)
542
+ L.append(" " + "─" * (4 + 4*len(BRACOS_42)))
543
+ for a in BRACOS_42:
544
+ row = f" {a:>4}" + "".join(f"{(a*b)%42:>4}" for b in BRACOS_42)
545
+ L.append(row)
546
+ L.append("")
547
+
548
+ ordens = ordens_grupo()
549
+ geradores = geradores_grupo()
550
+ L.append(f" Ordens dos elementos:")
551
+ for g_el in BRACOS_42:
552
+ L.append(f" g={g_el:2d}: ordem={ordens[g_el]}")
553
+ L.append(f" Geradores (ordem máxima): {geradores}")
554
+ L.append("")
555
+
556
+ # ── SEÇÃO 4: As Duas Famílias
557
+ L.append(sep2)
558
+ L.append("[ 4. DUAS FAMÍLIAS DE BRAÇOS ]")
559
+ L.append("")
560
+ L.append(" Os 12 braços dividem-se em 2 famílias por r mod 6:")
561
+ L.append("")
562
+ L.append(f" FAMÍLIA A (r ≡ 1 mod 6): {list(FAMILIA_A)}")
563
+ A_graus = sorted(set((r * 42) % 360 for r in FAMILIA_A))
564
+ L.append(f" Graus: {A_graus}")
565
+ L.append("")
566
+ L.append(f" FAMÍLIA B (r ≡ 5 mod 6): {list(FAMILIA_B)}")
567
+ B_graus = sorted(set((r * 42) % 360 for r in FAMILIA_B))
568
+ L.append(f" Graus: {B_graus}")
569
+ L.append("")
570
+ L.append(" Cada família gera exatamente 8 graus distintos (8+8=16 graus totais)")
571
+ L.append("")
572
+
573
+ # ── SEÇÃO 5: Identidade Gêmea
574
+ L.append(sep2)
575
+ L.append("[ 5. IDENTIDADE GÊMEA (T4) ]")
576
+ L.append("")
577
+ L.append(" TEOREMA: Para todo n inteiro,")
578
+ L.append(" F(n) + F(n+2) = 1 − cos(4πφ) · cos(4πφ·(n+1))")
579
+ L.append(f" cos(4πφ) = {COS_4PI_PHI:.10f} ← amplitude pequena ≈ 0.0874")
580
+ L.append("")
581
+ L.append(" Consequências:")
582
+ L.append(" · F(p) + F(p+2) ∈ [0.9126, 1.0874] para QUALQUER par (p, p+2)")
583
+ L.append(" · A soma ≈ 1.0 com desvio máximo ±0.0874")
584
+ L.append(" · O CENTRO p+1 controla o desvio: cos(4πφ(p+1)) modula a soma")
585
+ L.append(" · Para par gêmeo: F(p+2) é previsto EXATAMENTE dado F(p) e p")
586
+ L.append("")
587
+ L.append(" Verificação nos dados (10 primeiros pares gêmeos > 7):")
588
+ L.append(f" {'p':>6} {'p+2':>6} {'F(p)':>8} {'F(p+2)':>8} {'Soma':>10} {'Previsto':>10} {'Δ':>10}")
589
+ L.append(" " + "─"*72)
590
+
591
+ count_gemeos = 0
592
+ for p in primos:
593
+ if p > 7 and (p+2) in primos_set:
594
+ fp = Fn(p)
595
+ fp2 = Fn(p+2)
596
+ soma = fp + fp2
597
+ prev = identidade_gemea_prevista(p)
598
+ delta = abs(soma - prev)
599
+ L.append(f" {p:>6} {p+2:>6} {fp:>8.6f} {fp2:>8.6f} {soma:>10.8f} {prev:>10.8f} {delta:>10.2e}")
600
+ count_gemeos += 1
601
+ if count_gemeos >= 10:
602
+ break
603
+ L.append("")
604
+
605
+ # ── SEÇÃO 6: Equidistribuição
606
+ L.append(sep2)
607
+ L.append("[ 6. EQUIDISTRIBUIÇÃO DE Fn (T5) ]")
608
+ L.append("")
609
+ L.append(" TEOREMA (Weyl 1916 + Vinogradov): {φ·p mod 1 : p primo} é equidistribuída em [0,1]")
610
+ L.append(" Consequência: F(p) = sin²(2πφp) tem distribuição arcseno em [0,1]")
611
+ L.append(" → F(p) SOZINHO não discrimina primos de compostos candidatos")
612
+ L.append("")
613
+ L.append(" Distribuição de F(p) em 10 bins para primos em [1, N_max]:")
614
+ bins_fn = [0] * 10
615
+ for p in primos:
616
+ fn_p = Fn(p)
617
+ bins_fn[min(int(fn_p * 10), 9)] += 1
618
+ total_p = len(primos)
619
+ for i in range(10):
620
+ frac = bins_fn[i] / total_p
621
+ bar = "█" * int(frac * 60)
622
+ L.append(f" [{i/10:.1f}, {(i+1)/10:.1f}) {bins_fn[i]:5d} {frac:.4f} {bar}")
623
+ L.append(" (Distribuição em U — curva arcseno, confirmando equidistribuição)")
624
+ L.append("")
625
+
626
+ # ── SEÇÃO 7: Gerador e Estatísticas
627
+ L.append(sep2)
628
+ L.append("[ 7. GERADOR HELICOIDAL — PROVA DE COMPLETUDE ]")
629
+ L.append("")
630
+ L.append(" Algoritmo:")
631
+ L.append(" 1. Emitir pilares {2, 3, 5, 7}")
632
+ L.append(" 2. Para k = 0, 1, 2, ..., ⌊N/42⌋:")
633
+ L.append(" Para r em BRACOS_42 = {1,5,11,13,17,19,23,25,29,31,37,41}:")
634
+ L.append(" c = 42k + r")
635
+ L.append(" Se Miller-Rabin(c): emitir c com assinatura helicoidal")
636
+ L.append("")
637
+ L.append(f" Resultado para N = {N_max:,}:")
638
+ L.append(f" Primos gerados: {len(primos):,}")
639
+ L.append(f" Tempo de geração: {t_geracao:.4f} s")
640
+ L.append(f" Candidatos testados: {4 + sum(1 for k in range(N_max//42+1) for r in BRACOS_42 if 42*k+r <= N_max):,}")
641
+ n_cands = 4 + sum(1 for k in range(N_max//42+1) for r in BRACOS_42 if 42*k+r <= N_max)
642
+ L.append(f" Fração testada: {n_cands/N_max:.4f} = {n_cands/N_max*100:.2f}%")
643
+ L.append(f" Eliminados sem teste: {(1-n_cands/N_max)*100:.2f}%")
644
+ L.append(f" Falsos negativos: 0 (completude 100%)")
645
+ L.append(f" Falsos positivos: 0 (Miller-Rabin determinístico)")
646
+ L.append("")
647
+
648
+ # ── SEÇÃO 8: Distribuição por Braço
649
+ L.append(sep2)
650
+ L.append("[ 8. DISTRIBUIÇÃO POR BRAÇO MOD 42 ]")
651
+ L.append("")
652
+ L.append(" Teorema de Dirichlet: primos são equidistribuídos nos braços coprimos.")
653
+ L.append("")
654
+ L.append(f" {'Braço':>6} {'Familia':>7} {'Grau':>5} {'Primos':>7} {'Fração':>7} {'Fn_médio':>9}")
655
+ L.append(" " + "─"*55)
656
+
657
+ for r in BRACOS_42:
658
+ ps_arm = [p for p in primos if p % 42 == r]
659
+ fn_vals = [Fn(p) for p in ps_arm]
660
+ fam = 'A' if r in set(FAMILIA_A) else 'B'
661
+ g_val = (r * 42) % 360
662
+ fn_med = sum(fn_vals)/len(fn_vals) if fn_vals else 0
663
+ L.append(f" {r:>6} {fam:>7} {g_val:>5}° {len(ps_arm):>7} {len(ps_arm)/len(primos):>7.4f} {fn_med:>9.6f}")
664
+
665
+ L.append("")
666
+
667
+ # ── SEÇÃO 9: Os 96 Pares Fatoriais
668
+ L.append(sep2)
669
+ L.append("[ 9. FATORAÇÃO HELICOIDAL — 96 PARES POR CLASSE ]")
670
+ L.append("")
671
+ L.append(" Para N semiprime com r₄₂₀ = N mod 420:")
672
+ L.append(" N = p · q → r_p · r_q ≡ r₄₂₀ (mod 420)")
673
+ L.append(" Existem exatamente 96 pares (r_p, r_q) candidatos")
674
+ L.append(" Isso reduz 99% do espaço de busca vs força bruta")
675
+ L.append("")
676
+ L.append(" Exemplo para 5 classes mod 420:")
677
+ for r_ex in [1, 43, 101, 211, 419]:
678
+ pares = pares_fatoriais(r_ex)
679
+ L.append(f" r₄₂₀={r_ex:3d}: {len(pares)} pares — primeiros 3: {pares[:3]}")
680
+ L.append("")
681
+
682
+ # ── SEÇÃO 10: Primos Orfãos (Fn=0)
683
+ L.append(sep2)
684
+ L.append("[ 10. PRIMOS ÓRFÃOS — CICLO ZERO (Fn=0) ]")
685
+ L.append("")
686
+ L.append(" Primos p < 42 estão no ciclo 0: Fn_ciclo = sin²(0) = 0")
687
+ L.append(" São os 'primos órfãos' — seu braço r42 = p (pois p < 42)")
688
+ L.append("")
689
+ primos_orfaos = [p for p in primos if p < 42]
690
+ L.append(f" {'Primo':>6} {'Braço':>6} {'Ciclo':>6} {'Fn_ciclo':>10} {'Fn_elem':>10} {'Grau':>5}")
691
+ L.append(" " + "─"*55)
692
+ for p in primos_orfaos:
693
+ L.append(f" {p:>6} {p%42:>6} {p//42:>6} {Fn(p//42):>10.6f} {Fn(p):>10.6f} {(p*42)%360:>5}°")
694
+ L.append("")
695
+
696
+ # ── SEÇÃO 11: Mapa Completo dos 16 Graus
697
+ L.append(sep2)
698
+ L.append("[ 11. MAPA DOS 16 GRAUS ANGULARES ]")
699
+ L.append("")
700
+ L.append(" Grau(p) = (p·42) mod 360 — 16 graus possíveis para primos > 7")
701
+ L.append("")
702
+ L.append(f" {'Grau':>5} {'r mod 60':>9} {'Classes mod 420':>40} {'N primos':>8}")
703
+ L.append(" " + "─"*70)
704
+
705
+ for g_val in sorted(CLASSES_POR_GRAU.keys()):
706
+ cls = sorted(CLASSES_POR_GRAU[g_val])
707
+ r60 = cls[0] % 60
708
+ n_prm = sum(1 for p in primos if p > 7 and (p*42)%360 == g_val)
709
+ L.append(f" {g_val:>5}° {r60:>9} {str(cls):>40} {n_prm:>8}")
710
+ L.append("")
711
+
712
+ # ── SEÇÃO 12: Teoremas e Limites
713
+ L.append(sep2)
714
+ L.append("[ 12. TEOREMAS PROVADOS E LIMITES HONESTOS ]")
715
+ L.append("")
716
+ L.append(" ┌─── PROVADO ──────────────────────────────────────────────────────────┐")
717
+ L.append(" │ T1: Arm Sieve — p > 7 ⟹ p mod 42 ∈ {12 braços coprimos} │")
718
+ L.append(" │ T2: 96 Classes — p > 7 ∈ exatamente 1 das 96 classes mod 420 │")
719
+ L.append(" │ T3: Colapso — grau(p) = (r₄₂₀·42) mod 360 (independe do ciclo) │")
720
+ L.append(" │ T4: Id. Gêmea — F(p)+F(p+2) = 1−cos(4πφ)·cos(4πφ(p+1)) EXATO │")
721
+ L.append(" │ T5: Equidist. — F(p) é uniforme em [0,1] sobre primos │")
722
+ L.append(" │ T6: Grupo — (Z/42Z)* abeliano, ord 12, tabela 144 entradas │")
723
+ L.append(" └──────────────────────────────────────────────────────────────────────┘")
724
+ L.append("")
725
+ L.append(" ┌─── LIMITES (o que a teoria NÃO faz) ────────────────────────────────┐")
726
+ L.append(" │ L1: F(p) equidistribuído → NÃO discrimina primos de compostos │")
727
+ L.append(" │ candidatos dentro de uma classe mod 420 │")
728
+ L.append(" │ L2: Sem fórmula fechada determinística para o n-ésimo primo │")
729
+ L.append(" │ (equivalente à Conjectura de Hardy-Littlewood, em aberto) │")
730
+ L.append(" │ L3: O sieve helicoidal REDUZ (77-99%) mas NÃO ELIMINA o teste │")
731
+ L.append(" │ de primalidade │")
732
+ L.append(" └──────────────────────────────────────────────────────────────────────┘")
733
+ L.append("")
734
+
735
+ # ── SEÇÃO 13: Amostra de Assinaturas
736
+ L.append(sep2)
737
+ L.append("[ 13. ASSINATURAS HELICOIDAIS — PRIMEIROS 30 PRIMOS > 7 ]")
738
+ L.append("")
739
+ L.append(f" {'p':>8} {'r42':>4} {'r420':>5} {'ciclo':>6} {'Fn_ci':>8} "
740
+ f"{'Fn_el':>8} {'grau':>5} {'sig_gem':>9} {'Fam':>3} {'par_gem':>7}")
741
+ L.append(" " + "─" * 82)
742
+ count = 0
743
+ for p in primos:
744
+ if p <= 7:
745
+ continue
746
+ sig = assinatura_completa(p)
747
+ par_gem = "✓" if (p+2) in primos_set else ""
748
+ L.append(f" {p:>8,} {sig['braco_42']:>4} {sig['classe_420']:>5} "
749
+ f"{sig['ciclo']:>6} {sig['Fn_ciclo']:>8.5f} "
750
+ f"{sig['Fn_elem']:>8.5f} {sig['grau']:>5}° "
751
+ f"{sig['sig_gemea']:>9.6f} {sig['familia'] or '-':>3} {par_gem:>7}")
752
+ count += 1
753
+ if count >= 30:
754
+ break
755
+ L.append("")
756
+
757
+ L.append(sep)
758
+ L.append(f" OFFELLIA GENESIS v1.0 — Fim do Relatório")
759
+ L.append(f" Primos analisados: {len(primos):,} | Tempo de geração: {t_geracao:.4f}s")
760
+ L.append(sep)
761
+
762
+ with open(arquivo, "w", encoding="utf-8") as fh:
763
+ fh.write("\n".join(L) + "\n")
764
+
765
+ return len(primos), t_geracao, arquivo
766
+
767
+
768
+ # ══════════════════════════════════════════════════════════════════
769
+ # INTERFACE PRINCIPAL
770
+ # ══════════════════════════════════════════════════════════════════
771
+
772
+ def run():
773
+ sep = "═" * 70
774
+ sep2 = "─" * 70
775
+
776
+ print(sep)
777
+ print(" OFFELLIA GENESIS v1.0")
778
+ print(" Teoria Helicoidal Universal dos Números Primos")
779
+ print(f" φ(42)=12 braços | 96 classes mod 420 | 16 graus | 144 proporções")
780
+ print(sep)
781
+ print()
782
+
783
+ try:
784
+ modo = input(" Modo: [G]erar até N / [A]nalisar número / [R]elatório completo: ").strip().upper()
785
+ except (EOFError, KeyboardInterrupt):
786
+ modo = "R"
787
+
788
+ if modo == "G":
789
+ try:
790
+ N = int(input(" Gerar primos até N: ").strip())
791
+ except (ValueError, EOFError):
792
+ N = 1000
793
+
794
+ t0 = time.perf_counter()
795
+ primos = list(gerar_primos(N))
796
+ t = time.perf_counter() - t0
797
+ primos_set = set(primos)
798
+
799
+ print(sep2)
800
+ print(f" Primos gerados até {N:,}: {len(primos):,} ({t:.4f} s)")
801
+ print()
802
+ print(f" {'p':>10} {'r42':>4} {'grau':>5} {'Fn_ciclo':>9} {'Fn_elem':>9} {'sig_gem':>9} {'gem?':>5}")
803
+ print(f" {'─'*62}")
804
+ for p in primos[-20:]:
805
+ sig = assinatura_completa(p)
806
+ gem = "✓" if (p+2) in primos_set else ""
807
+ print(f" {p:>10,} {sig['braco_42']:>4} {sig['grau']:>5}° "
808
+ f"{sig['Fn_ciclo']:>9.6f} {sig['Fn_elem']:>9.6f} "
809
+ f"{sig['sig_gemea']:>9.6f} {gem:>5}")
810
+
811
+ nome_arq = f"genesis_gerador_{N}.txt"
812
+ gerar_relatorio(N, nome_arq)
813
+ print(f"\n Relatório salvo: '{nome_arq}'")
814
+
815
+ elif modo == "A":
816
+ try:
817
+ n_val = int(input(" Analisar número N: ").strip())
818
+ except (ValueError, EOFError):
819
+ n_val = 997
820
+
821
+ sig = assinatura_completa(n_val)
822
+ fat = fatorar_helicoidal(n_val)
823
+
824
+ print(sep2)
825
+ print(f" N = {n_val:,}")
826
+ print(f" É primo: {sig['eh_primo']}")
827
+ print(f" É candidato: {sig['eh_candidato']}")
828
+ print(f" Braço r42: {sig['braco_42']}")
829
+ print(f" Classe r420: {sig['classe_420']}")
830
+ print(f" Ciclo: {sig['ciclo']}")
831
+ print(f" Fn_elem: {sig['Fn_elem']:.10f}")
832
+ print(f" Fn_ciclo: {sig['Fn_ciclo']:.10f}")
833
+ print(f" Fn_log: {sig['Fn_log']:.10f}")
834
+ print(f" Grau: {sig['grau']}°")
835
+ print(f" Família: {sig['familia'] or 'N/A (pilar ou composto)'}")
836
+ print(f" Sig. gêmea: {sig['sig_gemea']:.10f}")
837
+ print(f" Sig. prevista: {sig['sig_gemea_prevista']:.10f}")
838
+ print(f" Δ (erro): {sig['erro_gemea']:.2e}")
839
+ print()
840
+ print(f" Fatoração: {fat['N']:,} = {fat['fatores_exp']}")
841
+ if sig['eh_candidato'] and not sig['eh_primo']:
842
+ pares = sig['pares_fatoriais'][:5]
843
+ print(f" Pares fatoriais (r_p, r_q) mod 420: {pares} (+{len(sig['pares_fatoriais'])-5} mais)")
844
+
845
+ nome_arq = f"genesis_analise_{n_val}.txt"
846
+ gerar_relatorio(max(n_val, 1000), nome_arq)
847
+ print(f"\n Relatório salvo: '{nome_arq}'")
848
+
849
+ else: # Relatório
850
+ try:
851
+ N = int(input(" Análise até N [padrão 10000]: ").strip() or "10000")
852
+ except (ValueError, EOFError):
853
+ N = 10000
854
+
855
+ nome_arq = f"genesis_relatorio_{N}.txt"
856
+ print(f"\n Gerando relatório completo até N={N:,}...")
857
+ n_primos, t_gen, arq = gerar_relatorio(N, nome_arq)
858
+ print(f" ✓ {n_primos:,} primos analisados em {t_gen:.4f}s")
859
+ print(f" Relatório salvo: '{arq}'")
860
+ print()
861
+
862
+
863
+ if __name__ == "__main__":
864
+ run()
OFFELLIA_ONDA.py ADDED
@@ -0,0 +1,755 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ ╔══════════════════════════════════════════════════════════════════════════════╗
3
+ ║ OFFELLIA_ONDA v1.0 — Busca de Primos pela Onda Única ║
4
+ ║ ║
5
+ ║ FUNDAMENTO: Os primos são cristalizações de UMA ÚNICA ONDA IRRACIONAL ║
6
+ ║ ║
7
+ ║ Ψ(x) = sin²(2πφx) φ = (1+√5)/2 ║
8
+ ║ f(x) = (φ·x) mod 1 — fase da onda em x ║
9
+ ║ ║
10
+ ║ ESTRUTURA EM 3 CAMADAS: ║
11
+ ║ ① ONDA: Ψ(x) — 100% determinística, calculável em O(1) para qualquer x ║
12
+ ║ ② RODA: mod 42, 12 janelas coprimas — ordem das fases é FIXA ║
13
+ ║ ③ SIEVE: Miller-Rabin determinístico — confirma cristalização ║
14
+ ║ ║
15
+ ║ TEOREMA DAS TRÊS DISTÂNCIAS (Steinhaus 1959): ║
16
+ ║ A sequência φ·1, φ·2, φ·3, ... mod 1 divide o círculo em EXATAMENTE ║
17
+ ║ 3 tamanhos de intervalo com razão φ — estrutura de Fibonacci. ║
18
+ ║ ║
19
+ ║ CINCO CANAIS GÊMEOS (únicos possíveis): ║
20
+ ║ Canal I:11→13 II:17→19 III:23→25 IV:29→31 V:41→1(cruzador) ║
21
+ ║ ║
22
+ ║ IDENTIDADE GÊMEA (Teorema T4): ║
23
+ ║ F(p) + F(p+2) = 1 − cos(4πφ)·cos(4πφ(p+1)) EXATA ║
24
+ ╚══════════════════════════════════════════════════════════════════════════════╝
25
+ """
26
+
27
+ import math
28
+ import time
29
+ import sys
30
+ from math import gcd, isqrt, sin, cos, pi, sqrt, log
31
+ from collections import Counter, defaultdict
32
+ from datetime import datetime
33
+ from decimal import Decimal, getcontext
34
+
35
+ # ══════════════════════════════════════════════════════════════════════
36
+ # CONSTANTES DA ONDA ÚNICA
37
+ # ══════════════════════════════════════════════════════════════════════
38
+
39
+ PHI = (1 + sqrt(5)) / 2 # Proporção áurea — frequência da onda
40
+ INV_PHI = PHI - 1 # 1/φ = φ-1 ≈ 0.6180...
41
+ TWO_PI_PHI = 2 * pi * PHI # 2πφ — frequência angular
42
+ FOUR_PI_PHI = 4 * pi * PHI # 4πφ — para identidade gêmea
43
+ COS_4PI_PHI = math.cos(FOUR_PI_PHI) # cos(4πφ) ≈ 0.08742572 — amplitude gêmea
44
+
45
+ # Três distâncias de Steinhaus para φ
46
+ S_PEQUENO = 2 - PHI # ≈ 0.3820 — intervalo menor
47
+ S_MEDIO = PHI - 1 # ≈ 0.6180 — intervalo médio = 1/φ
48
+ S_GRANDE = 1.0 # intervalo maior = círculo completo
49
+
50
+ # Roda helicoidal
51
+ MOD_42 = 42
52
+ MOD_420 = 420
53
+ PILARES = (2, 3, 5, 7)
54
+
55
+ # 12 braços coprimos de 42 — as janelas da onda
56
+ BRACOS_42 = tuple(r for r in range(1, 43) if gcd(r, 42) == 1)
57
+ BRACOS_SET = frozenset(BRACOS_42)
58
+
59
+ # 96 classes mod 420 — classificador O(1)
60
+ CLASSES_420 = tuple(r for r in range(1, 421) if all(r % p != 0 for p in PILARES))
61
+ CLASSES_420_SET = frozenset(CLASSES_420)
62
+
63
+ # Famílias dos braços
64
+ FAMILIA_A = frozenset(r for r in BRACOS_42 if r % 6 == 1) # {1,13,19,25,31,37}
65
+ FAMILIA_B = frozenset(r for r in BRACOS_42 if r % 6 == 5) # {5,11,17,23,29,41}
66
+
67
+ # Ordem das fases dos 12 braços (fixa — nunca muda)
68
+ BRACOS_POR_FASE = tuple(sorted(BRACOS_42, key=lambda r: (PHI * r) % 1))
69
+
70
+ # Cinco canais gêmeos
71
+ CANAIS_GEMEOS = {
72
+ (11, 13): "I (interno)",
73
+ (17, 19): "II (interno)",
74
+ (23, 25): "III (interno)",
75
+ (29, 31): "IV (interno)",
76
+ (41, 1): "V (cruzador k→k+1)",
77
+ }
78
+ BRACOS_GEMEO_INI = frozenset(r for r, _ in CANAIS_GEMEOS)
79
+ BRACOS_GEMEO_FIM = frozenset(r for _, r in CANAIS_GEMEOS)
80
+ CANAL_DE_BRACO = {r: c for (r, _), c in zip(CANAIS_GEMEOS.keys(), CANAIS_GEMEOS.values())}
81
+
82
+ # Progressão Δφ por ciclo de 42
83
+ DELTA_FASE_CICLO = (PHI * 42) % 1 # ≈ 0.9574 — avanço de fase por revolução
84
+
85
+
86
+ # ══════════════════════════��═══════════════════════════════════════════
87
+ # FUNÇÕES DA ONDA ÚNICA
88
+ # ══════════════════════════════════════════════════════════════════════
89
+
90
+ def onda(x: int) -> float:
91
+ """Ψ(x) = sin²(2πφx) — valor da onda no ponto x."""
92
+ return sin(TWO_PI_PHI * x) ** 2
93
+
94
+
95
+ def fase(x: int) -> float:
96
+ """f(x) = (φ·x) mod 1 — fase da onda em x ∈ [0, 1)."""
97
+ return (PHI * x) % 1
98
+
99
+
100
+ def onda_ciclo(x: int) -> float:
101
+ """Ψ do ciclo k = x//42: sin²(2πφ·k)."""
102
+ return onda(x // MOD_42)
103
+
104
+
105
+ def grau_angular(x: int) -> int:
106
+ """Projeção angular: (x·42) mod 360 — 16 valores possíveis para primos > 7."""
107
+ return (x * MOD_42) % 360
108
+
109
+
110
+ def identidade_gemea(p: int) -> float:
111
+ """Valor exato da Identidade Gêmea: 1 − cos(4πφ)·cos(4πφ(p+1))."""
112
+ return 1.0 - COS_4PI_PHI * math.cos(FOUR_PI_PHI * (p + 1))
113
+
114
+
115
+ def tipo_no(fn: float) -> str:
116
+ """Classifica o ponto da onda pelo valor Fn."""
117
+ if fn < 0.05: return "NÓ"
118
+ if fn > 0.95: return "ANTI-NÓDULO"
119
+ if fn < 0.25: return "próx-nó"
120
+ if fn > 0.75: return "próx-anti"
121
+ return "transição"
122
+
123
+
124
+ def salto_fase(p1: int, p2: int) -> float:
125
+ """Δφ = (φ·(p2-p1)) mod 1 — salto de fase entre dois primos consecutivos."""
126
+ return (PHI * (p2 - p1)) % 1
127
+
128
+
129
+ # ══════════════════════════════════════════════════════════════════════
130
+ # CAMADA 3 — MILLER-RABIN DETERMINÍSTICO
131
+ # Correto para n < 3.317×10²⁴ com estas witnesses.
132
+ # ══════════════════════════════════════════════════════════════════════
133
+
134
+ _WITNESSES = (2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37)
135
+
136
+ def _miller_rabin_core(n: int) -> bool:
137
+ r, d = 0, n - 1
138
+ while d % 2 == 0:
139
+ r += 1
140
+ d //= 2
141
+ for a in _WITNESSES:
142
+ if a >= n:
143
+ continue
144
+ x = pow(a, d, n)
145
+ if x == 1 or x == n - 1:
146
+ continue
147
+ for _ in range(r - 1):
148
+ x = x * x % n
149
+ if x == n - 1:
150
+ break
151
+ else:
152
+ return False
153
+ return True
154
+
155
+
156
+ def eh_primo(n: int) -> bool:
157
+ """
158
+ Teste de primalidade helicoidal em 3 fases:
159
+ ① Pilares {2,3,5,7} — O(1)
160
+ ② Classificador mod 420 — O(1), elimina 77.1%
161
+ ③ Miller-Rabin determinístico — confirma
162
+ """
163
+ if n < 2:
164
+ return False
165
+ if n in (2, 3, 5, 7):
166
+ return True
167
+ if any(n % p == 0 for p in PILARES):
168
+ return False
169
+ if (n % MOD_420) not in CLASSES_420_SET: # ← filtro da onda mod 420
170
+ return False
171
+ return _miller_rabin_core(n)
172
+
173
+
174
+ # ══════════════════════════════════════════════════════════════════════
175
+ # GERADOR HELICOIDAL — VARREDURA DAS JANELAS DA ONDA
176
+ # ══════════════════════════════════════════════════════════════════════
177
+
178
+ def gerar_primos_onda(N: int):
179
+ """
180
+ Gera todos os primos até N percorrendo as janelas da onda.
181
+
182
+ A onda varre os ciclos k=0,1,2,...,⌊N/42⌋.
183
+ Em cada ciclo, testa apenas as 12 janelas coprimas de 42.
184
+ As janelas são visitadas em ORDEM DE FASE CRESCENTE
185
+ (sequência determinística de Fibonacci).
186
+ """
187
+ # Pilares primeiro
188
+ for p in PILARES:
189
+ if p <= N:
190
+ yield p
191
+
192
+ k = 0
193
+ while True:
194
+ base = MOD_42 * k
195
+ if base > N:
196
+ break
197
+ # Visita janelas em ordem de fase (estrutura de Fibonacci)
198
+ for r in BRACOS_POR_FASE:
199
+ c = base + r
200
+ if c < 8:
201
+ continue
202
+ if c > N:
203
+ continue
204
+ if eh_primo(c):
205
+ yield c
206
+ k += 1
207
+
208
+
209
+ # ══════════════════════════════════════════════════════════════════════
210
+ # ASSINATURA HELICOIDAL COMPLETA
211
+ # ══════════════════════════════════════════════════════════════════════
212
+
213
+ def assinatura(p: int, primos_set: set = None) -> dict:
214
+ """Retorna a assinatura helicoidal completa do primo p."""
215
+ r42 = p % MOD_42
216
+ r420 = p % MOD_420
217
+ k = p // MOD_42
218
+ fn_p = onda(p)
219
+ fn_k = onda(k)
220
+ f_p = fase(p)
221
+ grau = grau_angular(p)
222
+
223
+ # Família
224
+ fam = 'A' if r42 in FAMILIA_A else ('B' if r42 in FAMILIA_B else '?')
225
+
226
+ # Canal gêmeo
227
+ canal = None
228
+ for (r1, r2), nome in CANAIS_GEMEOS.items():
229
+ if r42 == r1 or r42 == r2:
230
+ canal = nome
231
+ break
232
+
233
+ # Par gêmeo (se primos_set fornecido)
234
+ eh_gem = False
235
+ if primos_set is not None:
236
+ eh_gem = (p + 2 in primos_set) or (p - 2 in primos_set)
237
+
238
+ # Identidade gêmea
239
+ sig_gem = fn_p + onda(p + 2)
240
+ sig_prevista = identidade_gemea(p)
241
+
242
+ # Tipo de nó
243
+ no = tipo_no(fn_p)
244
+
245
+ # Três distâncias — tamanho do intervalo de fase deste braço
246
+ idx = BRACOS_POR_FASE.index(r42) if r42 in BRACOS_SET else -1
247
+ if idx >= 0:
248
+ r_prox = BRACOS_POR_FASE[(idx + 1) % 12]
249
+ df_steinhaus = (fase(r_prox) - fase(r42)) % 1
250
+ else:
251
+ df_steinhaus = 0.0
252
+
253
+ return {
254
+ 'p': p,
255
+ 'braco_42': r42,
256
+ 'classe_420': r420,
257
+ 'ciclo_k': k,
258
+ 'Fn_onda': fn_p,
259
+ 'Fn_ciclo': fn_k,
260
+ 'fase': f_p,
261
+ 'grau': grau,
262
+ 'familia': fam,
263
+ 'canal_gemeo': canal,
264
+ 'eh_gemeo': eh_gem,
265
+ 'sig_gemea': sig_gem,
266
+ 'sig_prevista': sig_prevista,
267
+ 'erro_gemea': abs(sig_gem - sig_prevista),
268
+ 'tipo_no': no,
269
+ 'df_steinhaus': df_steinhaus,
270
+ }
271
+
272
+
273
+ # ══════════════════════════════════════════════════════════════════════
274
+ # GERAÇÃO DO RELATÓRIO COMPLETO
275
+ # ══════════════════════════════════════════════════════════════════════
276
+
277
+ def gerar_relatorio(N: int, primos: list, t_busca: float, arquivo: str):
278
+ primos_set = set(primos)
279
+ L = []
280
+ SEP = "═" * 76
281
+ SEP2 = "─" * 76
282
+
283
+ def linha(s=""): L.append(s)
284
+
285
+ # ── CABEÇALHO
286
+ linha(SEP)
287
+ linha(" OFFELLIA_ONDA v1.0 — Relatório da Onda Única dos Primos")
288
+ linha(f" Gerado em: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
289
+ linha(f" Busca até N = {N:,} | Tempo: {t_busca:.6f} s | Primos: {len(primos):,}")
290
+ linha(SEP)
291
+ linha()
292
+
293
+ # ── SEÇÃO 1: Fundamento da onda
294
+ linha(SEP2)
295
+ linha(" [ 1. FUNDAMENTO — A ONDA ÚNICA ]")
296
+ linha()
297
+ linha(" Ψ(x) = sin²(2πφx) φ = (1+√5)/2 = proporção áurea")
298
+ linha(" f(x) = (φ·x) mod 1 = fase da onda em x")
299
+ linha()
300
+ linha(f" φ = {PHI:.15f}")
301
+ linha(f" 2πφ = {TWO_PI_PHI:.15f}")
302
+ linha(f" cos(4πφ) = {COS_4PI_PHI:.15f} ← amplitude gêmea")
303
+ linha(f" Δφ/ciclo de 42 = {DELTA_FASE_CICLO:.15f}")
304
+ linha()
305
+ linha(" TRÊS DISTÂNCIAS DE STEINHAUS para φ:")
306
+ linha(f" s_pequeno = 2-φ = {S_PEQUENO:.10f}")
307
+ linha(f" s_médio = φ-1 = {S_MEDIO:.10f} = 1/φ")
308
+ linha(f" s_grande = 1 = s_pequeno + s_médio (círculo completo)")
309
+ linha(f" razão: s_médio/s_pequeno = {S_MEDIO/S_PEQUENO:.10f} → φ = {PHI:.10f}")
310
+ linha()
311
+ linha(" Ordem das fases dos 12 braços (FIXA — estrutura de Fibonacci):")
312
+ linha()
313
+ linha(f" {'braço':>6} {'fase φ·r':>12} {'Fn(r)':>8} {'intervalo Δf':>14}")
314
+ linha(" " + "─" * 46)
315
+ for i, r in enumerate(BRACOS_POR_FASE):
316
+ f_r = fase(r)
317
+ fn_r = onda(r)
318
+ r_prox = BRACOS_POR_FASE[(i + 1) % 12]
319
+ df = (fase(r_prox) - f_r) % 1
320
+ linha(f" {r:>6} {f_r:>12.8f} {fn_r:>8.5f} {df:>14.8f}")
321
+ linha()
322
+
323
+ # ── SEÇÃO 2: Parâmetros da busca
324
+ linha(SEP2)
325
+ linha(" [ 2. PARÂMETROS DA BUSCA ]")
326
+ linha()
327
+ n_ciclos = N // MOD_42 + 1
328
+ n_candidatos = n_ciclos * 12
329
+ taxa_candidatos = n_candidatos / N * 100 if N > 0 else 0
330
+ taxa_eliminados = 100 - taxa_candidatos
331
+
332
+ linha(f" N buscado: {N:>15,}")
333
+ linha(f" Ciclos de 42: {n_ciclos:>15,}")
334
+ linha(f" Candidatos testados:{n_candidatos:>15,} ({taxa_candidatos:.2f}% dos inteiros)")
335
+ linha(f" Eliminados sem teste:{N - n_candidatos:>14,} ({taxa_eliminados:.2f}% dos inteiros)")
336
+ linha(f" Primos encontrados: {len(primos):>15,}")
337
+ if t_busca > 0:
338
+ linha(f" Velocidade: {len(primos)/t_busca:>15,.0f} primos/s")
339
+ linha()
340
+
341
+ # ── SEÇÃO 3: Distribuição por fase (a onda)
342
+ linha(SEP2)
343
+ linha(" [ 3. DISTRIBUIÇÃO DOS PRIMOS NA ONDA — FASES ]")
344
+ linha()
345
+ linha(" A fase f(p) = (φ·p) mod 1 distribui os primos em [0,1]")
346
+ linha(" Por Weyl: distribuição uniforme (equidistribuição)")
347
+ linha()
348
+
349
+ N_faixas = 20
350
+ faixas_fase = defaultdict(int)
351
+ faixas_fn = defaultdict(list)
352
+ for p in primos:
353
+ if p > 7:
354
+ b = min(N_faixas - 1, int(fase(p) * N_faixas))
355
+ faixas_fase[b] += 1
356
+ faixas_fn[b].append(onda(p))
357
+
358
+ total_gt7 = len([p for p in primos if p > 7])
359
+ linha(f" {'Faixa fase':>14} {'Fn médio':>9} {'count':>7} {'% total':>8} Barra (equidist. esperada)")
360
+ linha(" " + "─" * 72)
361
+ esperado = total_gt7 / N_faixas
362
+ for i in range(N_faixas):
363
+ a = i / N_faixas; b = (i + 1) / N_faixas
364
+ cnt = faixas_fase[i]
365
+ fn_list = faixas_fn[i]
366
+ fn_med = sum(fn_list) / len(fn_list) if fn_list else 0
367
+ pct = cnt / total_gt7 * 100 if total_gt7 else 0
368
+ desvio = (cnt - esperado) / esperado * 100 if esperado else 0
369
+ barra = "█" * int(pct / 5 * 10)
370
+ linha(f" [{a:.2f},{b:.2f}) {fn_med:>9.5f} {cnt:>7,} {pct:>7.2f}% {barra}")
371
+ linha()
372
+
373
+ # ── SEÇÃO 4: Nós e anti-nódulos
374
+ linha(SEP2)
375
+ linha(" [ 4. NÓS E ANTI-NÓDULOS DA ONDA ]")
376
+ linha()
377
+ linha(" NÓ → Fn < 0.05 (fase próxima de 0 ou 1)")
378
+ linha(" ANTI-NÓD. → Fn > 0.95 (fase próxima de 0.5)")
379
+ linha()
380
+
381
+ nos = [p for p in primos if p > 7 and onda(p) < 0.05]
382
+ antinos = [p for p in primos if p > 7 and onda(p) > 0.95]
383
+ trans = [p for p in primos if p > 7 and 0.05 <= onda(p) <= 0.95]
384
+
385
+ linha(f" NÓS (Fn < 0.05): {len(nos):>7,} ({len(nos)/total_gt7*100:.2f}%)")
386
+ linha(f" ANTI-NÓDULOS (Fn > 0.95): {len(antinos):>7,} ({len(antinos)/total_gt7*100:.2f}%)")
387
+ linha(f" TRANSIÇÃO (0.05-0.95): {len(trans):>7,} ({len(trans)/total_gt7*100:.2f}%)")
388
+ linha()
389
+ if nos:
390
+ fn_nos = [onda(p) for p in nos]
391
+ linha(f" Fn mín nos nós: {min(fn_nos):.10f}")
392
+ linha(f" Fn máx nos nós: {max(fn_nos):.10f}")
393
+ if antinos:
394
+ fn_an = [onda(p) for p in antinos]
395
+ linha(f" Fn mín anti-nódulos: {min(fn_an):.10f}")
396
+ linha(f" Fn máx anti-nódulos: {max(fn_an):.10f}")
397
+ linha()
398
+ linha(" Primeiros 10 primos NÓ (Fn≈0):")
399
+ linha(f" {'p':>10} {'fase':>10} {'Fn':>12} {'braço':>6} {'k(ciclo)':>9}")
400
+ linha(" " + "─" * 55)
401
+ for p in nos[:10]:
402
+ linha(f" {p:>10,} {fase(p):>10.6f} {onda(p):>12.8f} {p%42:>6} {p//42:>9,}")
403
+ linha()
404
+ linha(" Primeiros 10 primos ANTI-NÓDULO (Fn≈1):")
405
+ linha(f" {'p':>10} {'fase':>10} {'Fn':>12} {'braço':>6} {'k(ciclo)':>9}")
406
+ linha(" " + "─" * 55)
407
+ for p in antinos[:10]:
408
+ linha(f" {p:>10,} {fase(p):>10.6f} {onda(p):>12.8f} {p%42:>6} {p//42:>9,}")
409
+ linha()
410
+
411
+ # ── SEÇÃO 5: Os 12 braços — assinaturas
412
+ linha(SEP2)
413
+ linha(" [ 5. OS 12 BRAÇOS DA ONDA — ASSINATURAS ]")
414
+ linha()
415
+ linha(f" {'r':>4} {'Fam':>3} {'grau°':>6} {'fase φr':>10} {'count':>7} "
416
+ f"{'Fn med':>7} {'σ':>6} {'tipo':>20}")
417
+ linha(" " + "─" * 78)
418
+ for r in BRACOS_42:
419
+ ps_r = [p for p in primos if p > 7 and p % 42 == r]
420
+ if not ps_r:
421
+ continue
422
+ fns = [onda(p) for p in ps_r]
423
+ med = sum(fns) / len(fns)
424
+ sig = (sum((x - med) ** 2 for x in fns) / len(fns)) ** 0.5
425
+ fam = 'A' if r in FAMILIA_A else 'B'
426
+ grau = (r * 42) % 360
427
+ f_r = fase(r)
428
+ # tipo
429
+ viz = []
430
+ if (r + 2) % 42 in BRACOS_SET: viz.append(f"+2→{(r+2)%42}")
431
+ if (r - 2) % 42 in BRACOS_SET: viz.append(f"-2→{(r-2)%42}")
432
+ tipo = ("gêmeo " + str(viz[0])) if viz else "isolado"
433
+ linha(f" {r:>4} {fam:>3} {grau:>6}° {f_r:>10.6f} {len(ps_r):>7,} "
434
+ f"{med:>7.5f} {sig:>6.4f} {tipo:>20}")
435
+ linha()
436
+
437
+ # ── SEÇÃO 6: Cinco canais gêmeos
438
+ linha(SEP2)
439
+ linha(" [ 6. OS 5 CANAIS GÊMEOS DA ONDA ]")
440
+ linha()
441
+ linha(" Único conjuntos de braços a distância 2 que são ambos coprimos de 42.")
442
+ linha(" O elemento médio p+1 tem sempre gcd(p+1, 42) > 1 — janela fechada.")
443
+ linha()
444
+
445
+ gemeos = [(p, p + 2) for p in primos if p + 2 in primos_set and p > 7]
446
+
447
+ linha(f" Total de pares gêmeos: {len(gemeos):,}")
448
+ linha()
449
+ linha(f" {'Canal':>25} {'braços':>9} {'pares':>7} {'Σ F(p)+F(q) med':>16} {'σ':>7}")
450
+ linha(" " + "─" * 72)
451
+ for (r1, r2), nome in CANAIS_GEMEOS.items():
452
+ canal_g = [(p, q) for p, q in gemeos if p % 42 == r1]
453
+ somas = [onda(p) + onda(q) for p, q in canal_g]
454
+ med = sum(somas) / len(somas) if somas else 0
455
+ sig = (sum((x - med) ** 2 for x in somas) / len(somas)) ** 0.5 if somas else 0
456
+ linha(f" Canal {nome:>19} ({r1:>2},{r2:>2}) {len(canal_g):>7,} {med:>16.8f} {sig:>7.5f}")
457
+ linha()
458
+ linha(" Identidade Gêmea (T4): F(p)+F(p+2) = 1 − cos(4πφ)·cos(4πφ(p+1))")
459
+ linha(f" cos(4πφ) = {COS_4PI_PHI:.10f}")
460
+ linha(f" Intervalo da soma: [{1-abs(COS_4PI_PHI):.8f}, {1+abs(COS_4PI_PHI):.8f}]")
461
+ linha()
462
+ if gemeos:
463
+ erros = [abs(onda(p) + onda(q) - identidade_gemea(p)) for p, q in gemeos[:500]]
464
+ linha(f" Verificação T4 em {min(500,len(gemeos))} pares:")
465
+ linha(f" Erro máximo: {max(erros):.2e}")
466
+ linha(f" Erro médio: {sum(erros)/len(erros):.2e}")
467
+ linha()
468
+
469
+ # ── SEÇÃO 7: Saltos de fase
470
+ linha(SEP2)
471
+ linha(" [ 7. SALTOS DE FASE — PROGRESSÃO DA ONDA ]")
472
+ linha()
473
+ linha(" Δφ(gap) = (φ·gap) mod 1 — cada gap tem Δφ determinístico")
474
+ linha()
475
+
476
+ gaps_obs = Counter(primos[i+1] - primos[i] for i in range(len(primos)-1))
477
+ linha(f" {'gap':>5} {'Δφ=φ·gap mod 1':>18} {'count':>8} {'% total':>8} Significado")
478
+ linha(" " + "─" * 70)
479
+ total_gaps = sum(gaps_obs.values())
480
+ for gap, cnt in sorted(gaps_obs.items(), key=lambda x: -x[1])[:15]:
481
+ df = (PHI * gap) % 1
482
+ pct = cnt / total_gaps * 100
483
+ sig = ""
484
+ if gap == 2: sig = "← gap mínimo (gêmeos)"
485
+ elif gap == 6: sig = "← gap dominante"
486
+ elif gap == 4: sig = "← 2° mais comum"
487
+ elif gap == 1: sig = "← 2→3 (único gap ímpar)"
488
+ linha(f" {gap:>5} {df:>18.8f} {cnt:>8,} {pct:>7.2f}% {sig}")
489
+ linha()
490
+
491
+ # ── SEÇÃO 8: Taxonomia dos 7 tipos
492
+ linha(SEP2)
493
+ linha(" [ 8. TAXONOMIA COMPLETA — 7 TIPOS NATURAIS DE PRIMO ]")
494
+ linha()
495
+
496
+ bracos_gemeo_set = {r for r, _ in CANAIS_GEMEOS} | {r for _, r in CANAIS_GEMEOS}
497
+
498
+ tipos = {
499
+ 'Pilares': [p for p in primos if p in (2,3,5,7)],
500
+ 'Órfãos k=0': [p for p in primos if 7 < p < 42],
501
+ 'Harmônicos r=1': [p for p in primos if p > 42 and p % 42 == 1],
502
+ 'Gêmeos internos': [p for p in primos if p > 7 and p % 42 in {11,13,17,19,23,25,29,31}
503
+ and (p+2 in primos_set or p-2 in primos_set)],
504
+ 'Gêmeos cruzadores':[p for p in primos if p > 7 and p % 42 in {41,1}
505
+ and (p+2 in primos_set or p-2 in primos_set)],
506
+ 'Isolados r={5,37}':[p for p in primos if p > 7 and p % 42 in {5, 37}],
507
+ 'Solitários': [p for p in primos if p > 7 and p % 42 in bracos_gemeo_set
508
+ and p+2 not in primos_set and p-2 not in primos_set],
509
+ }
510
+
511
+ linha(f" {'Tipo':>22} {'count':>8} {'%':>6} Fn médio Descrição")
512
+ linha(" " + "─" * 78)
513
+ for nome, lista in tipos.items():
514
+ cnt = len(lista)
515
+ pct = cnt / total_gt7 * 100 if total_gt7 and nome != 'Pilares' else 0
516
+ fns = [onda(p) for p in lista if p > 7] or [0]
517
+ med = sum(fns) / len(fns)
518
+ descs = {
519
+ 'Pilares': "Base: 2,3,5,7",
520
+ 'Órfãos k=0': "ciclo zero, Fn_ciclo=0",
521
+ 'Harmônicos r=1': "p^n sempre no braço 1",
522
+ 'Gêmeos internos': "braços {11,13,17,19,23,25,29,31}",
523
+ 'Gêmeos cruzadores': "braços {41,1}, cruza fronteira k",
524
+ 'Isolados r={5,37}': "gap mínimo ≥ 4, nunca gêmeos",
525
+ 'Solitários': "braço gêmeo mas sem par vizinho",
526
+ }
527
+ linha(f" {nome:>22} {cnt:>8,} {pct:>6.2f}% {med:>8.5f} {descs.get(nome,'')}")
528
+ linha()
529
+
530
+ # ── SEÇÃO 9: Assinaturas — primeiros 50 primos > 7
531
+ linha(SEP2)
532
+ linha(" [ 9. ASSINATURAS HELICOIDAIS — PRIMEIROS 50 PRIMOS > 7 ]")
533
+ linha()
534
+ linha(f" {'p':>10} {'r42':>4} {'k':>7} {'fase':>10} {'Fn(p)':>8} "
535
+ f"{'grau':>5} {'tipo_nó':>11} {'canal':>5} {'gêmeo':>6}")
536
+ linha(" " + "─" * 80)
537
+ count = 0
538
+ for p in primos:
539
+ if p <= 7:
540
+ continue
541
+ fn = onda(p)
542
+ f = fase(p)
543
+ k = p // 42
544
+ r = p % 42
545
+ gr = grau_angular(p)
546
+ no = tipo_no(fn)
547
+ # canal
548
+ canal_str = ""
549
+ for (r1, r2), nome_c in CANAIS_GEMEOS.items():
550
+ if r == r1 or r == r2:
551
+ canal_str = f"C{nome_c[1]}"
552
+ break
553
+ gem = "✓" if (p+2 in primos_set or p-2 in primos_set) else ""
554
+ linha(f" {p:>10,} {r:>4} {k:>7,} {f:>10.6f} {fn:>8.5f} "
555
+ f"{gr:>5}° {no:>11} {canal_str:>5} {gem:>6}")
556
+ count += 1
557
+ if count >= 50:
558
+ break
559
+ linha()
560
+
561
+ # ── SEÇÃO 10: Últimos 20 primos encontrados
562
+ linha(SEP2)
563
+ linha(" [ 10. ÚLTIMOS 20 PRIMOS ENCONTRADOS ]")
564
+ linha()
565
+ linha(f" {'p':>12} {'r42':>4} {'k':>9} {'fase':>10} {'Fn(p)':>8} "
566
+ f"{'grau':>5} {'tipo_nó':>11}")
567
+ linha(" " + "─" * 70)
568
+ for p in primos[-20:]:
569
+ fn = onda(p)
570
+ f = fase(p)
571
+ k = p // 42
572
+ r = p % 42
573
+ gr = grau_angular(p)
574
+ no = tipo_no(fn)
575
+ linha(f" {p:>12,} {r:>4} {k:>9,} {f:>10.6f} {fn:>8.5f} {gr:>5}° {no:>11}")
576
+ linha()
577
+
578
+ # ── SEÇÃO 11: Estatísticas globais da onda
579
+ linha(SEP2)
580
+ linha(" [ 11. ESTATÍSTICAS GLOBAIS DA ONDA ]")
581
+ linha()
582
+ fn_todos = [onda(p) for p in primos if p > 7]
583
+ if fn_todos:
584
+ media_fn = sum(fn_todos) / len(fn_todos)
585
+ var_fn = sum((x - media_fn) ** 2 for x in fn_todos) / len(fn_todos)
586
+ sigma_fn = var_fn ** 0.5
587
+ fn_min = min(fn_todos)
588
+ fn_max = max(fn_todos)
589
+ # primo com Fn mais próximo de 0 (nó mais puro)
590
+ p_no = min((p for p in primos if p > 7), key=lambda p: onda(p))
591
+ p_an = max((p for p in primos if p > 7), key=lambda p: onda(p))
592
+
593
+ linha(f" Fn médio sobre todos primos > 7: {media_fn:.10f}")
594
+ linha(f" (teórico pela equidistribuição: 0.5000000000)")
595
+ linha(f" Desvio padrão Fn: {sigma_fn:.10f}")
596
+ linha(f" Fn mínimo: {fn_min:.12f} → primo {p_no:,} (NÓ mais puro)")
597
+ linha(f" Fn máximo: {fn_max:.12f} → primo {p_an:,} (ANTI-NÓ mais puro)")
598
+ linha()
599
+ # Fase média
600
+ fases = [fase(p) for p in primos if p > 7]
601
+ media_fase = sum(fases) / len(fases)
602
+ linha(f" Fase média: {media_fase:.10f} (teórico: 0.5000000000)")
603
+ linha()
604
+ # Verificação do Teorema T5 (equidistribuição)
605
+ desv_weyl = abs(media_fn - 0.5)
606
+ linha(f" Desvio de Weyl |E[Fn] - 0.5|: {desv_weyl:.2e}")
607
+ linha(f" Ordem esperada por Weyl: O(1/√N) ≈ {1/len(fn_todos)**0.5:.2e}")
608
+ linha()
609
+
610
+ # ── SEÇÃO 12: Ciclos notáveis — quasi-periodicidade
611
+ linha(SEP2)
612
+ linha(" [ 12. QUASI-PERIODICIDADE — ESTRUTURA DE FIBONACCI ]")
613
+ linha()
614
+ linha(f" Δφ por ciclo de 42 = {DELTA_FASE_CICLO:.10f}")
615
+ linha()
616
+ linha(" Sequência de convergentes Fibonacci da fase:")
617
+ linha()
618
+ linha(f" {'F(n)':>8} {'Δφ·F(n) mod 1':>16} {'distância a 0':>14} {'nível'}")
619
+ linha(" " + "─" * 52)
620
+ fibs = [1, 1]
621
+ while fibs[-1] < 5000:
622
+ fibs.append(fibs[-1] + fibs[-2])
623
+ for f_n in fibs[:14]:
624
+ acum = (DELTA_FASE_CICLO * f_n) % 1
625
+ dist = min(acum, 1 - acum)
626
+ nivel = "← quasi-período" if dist < 0.01 else ""
627
+ linha(f" {f_n:>8,} {acum:>16.8f} {dist:>14.8f} {nivel}")
628
+ linha()
629
+
630
+ # ── SEÇÃO 13: Teoremas e limites
631
+ linha(SEP2)
632
+ linha(" [ 13. TEOREMAS PROVADOS E LIMITES HONESTOS ]")
633
+ linha()
634
+ linha(" ┌─── PROVADO ──────────────────────────────────────────────────┐")
635
+ linha(" │ T1: Arm Sieve — p>7 ⟹ p mod 42 ∈ {12 braços coprimos} │")
636
+ linha(" │ T2: 96 Classes — p>7 ∈ exatamente 1 das 96 classes mod 420 │")
637
+ linha(" │ T3: Colapso — grau(p) = (r₄₂₀·42) mod 360 │")
638
+ linha(" │ T4: Id.Gêmea — F(p)+F(p+2) = 1−cos(4πφ)·cos(4πφ(p+1)) │")
639
+ linha(" │ T5: Equidist. — F(p) uniforme em [0,1] (Weyl+Vinogradov) │")
640
+ linha(" │ T6: Grupo — (Z/42Z)* abeliano, ord 12, 144 proporções │")
641
+ linha(" │ T7: 3 Distâncias— φ·n mod 1 cria exatamente 3 intervalos │")
642
+ linha(" │ com razão φ (Teorema de Steinhaus, 1959) │")
643
+ linha(" └──────────────────────────────────────────────────────────────┘")
644
+ linha()
645
+ linha(" ┌─── LIMITES (o que a teoria NÃO faz) ─────────────────────────┐")
646
+ linha(" │ L1: A fase f(p) é uniforme → NÃO discrimina primo/composto │")
647
+ linha(" │ dentro de uma classe mod 420 │")
648
+ linha(" │ L2: Não existe fórmula fechada f(n)→p_n (Conj. Hardy-Litt.) │")
649
+ linha(" │ L3: O sieve reduz (77-99%) mas NÃO elimina o teste │")
650
+ linha(" │ L4: Fn(p) não prediz se p é gêmeo ou solitário │")
651
+ linha(" └───────────────────────────────────────────────────────────────┘")
652
+ linha()
653
+
654
+ # ── RODAPÉ
655
+ linha(SEP)
656
+ linha(f" OFFELLIA_ONDA v1.0 — Fim do Relatório")
657
+ linha(f" N={N:,} | {len(primos):,} primos | {t_busca:.6f} s")
658
+ linha(SEP)
659
+
660
+ with open(arquivo, "w", encoding="utf-8") as fh:
661
+ fh.write("\n".join(L) + "\n")
662
+
663
+ return arquivo
664
+
665
+
666
+ # ══════════════════════════════════════════════════════════════════════
667
+ # INTERFACE PRINCIPAL
668
+ # ══════════════════════════════════════════════════════════════════════
669
+
670
+ def run():
671
+ SEP = "═" * 76
672
+ SEP2 = "─" * 76
673
+
674
+ print()
675
+ print(SEP)
676
+ print(" OFFELLIA_ONDA v1.0")
677
+ print(" Busca de Primos pela Onda Única Irracional")
678
+ print()
679
+ print(f" Ψ(x) = sin²(2πφx) φ = {PHI:.10f}")
680
+ print(f" Fase: f(x) = (φ·x) mod 1 | 3 distâncias de Steinhaus")
681
+ print(f" 12 janelas por ciclo de 42 | 96 classes mod 420 | 5 canais gêmeos")
682
+ print(SEP)
683
+ print()
684
+
685
+ # ── Entrada
686
+ try:
687
+ entrada = input(" Buscar primos até N: ").strip()
688
+ N = int(entrada)
689
+ except (ValueError, EOFError):
690
+ N = 10000
691
+
692
+ if N < 2:
693
+ print(" N deve ser ≥ 2.")
694
+ return
695
+
696
+ print()
697
+ print(f" Iniciando busca até N = {N:,} ...")
698
+ print(f" Varredura das 12 janelas em ordem de fase (Fibonacci) ...")
699
+ print()
700
+
701
+ # ── Busca
702
+ t0 = time.perf_counter()
703
+ primos = list(gerar_primos_onda(N))
704
+ t_busca = time.perf_counter() - t0
705
+
706
+ primos_set = set(primos)
707
+
708
+ # ── Resumo imediato
709
+ print(SEP)
710
+ print(f" RESULTADO DA BUSCA")
711
+ print(SEP2)
712
+ print(f" N buscado: {N:>15,}")
713
+ print(f" Primos encontrados: {len(primos):>15,}")
714
+ print(f" Tempo total: {t_busca:>15.6f} s")
715
+ if t_busca > 0:
716
+ print(f" Velocidade: {len(primos)/t_busca:>15,.0f} primos/s")
717
+ print(SEP2)
718
+
719
+ if primos:
720
+ gemeos = [(p, p+2) for p in primos if p+2 in primos_set and p > 7]
721
+ fn_todos = [onda(p) for p in primos if p > 7]
722
+ media_fn = sum(fn_todos) / len(fn_todos) if fn_todos else 0
723
+
724
+ print(f" Maior primo: {primos[-1]:>15,}")
725
+ print(f" Pares gêmeos: {len(gemeos):>15,}")
726
+ print(f" Fn médio (Weyl→0.5): {media_fn:>15.8f}")
727
+ print()
728
+
729
+ # Resumo dos 5 canais
730
+ print(f" Distribuição pelos 5 canais gêmeos:")
731
+ for (r1, r2), nome in CANAIS_GEMEOS.items():
732
+ cnt = sum(1 for p, q in gemeos if p % 42 == r1)
733
+ print(f" Canal {nome}: {cnt:,}")
734
+ print()
735
+
736
+ # Últimos 5 primos
737
+ print(f" Últimos 5 primos encontrados:")
738
+ for p in primos[-5:]:
739
+ fn = onda(p); f = fase(p)
740
+ no = tipo_no(fn)
741
+ gem = "✓ gêmeo" if (p+2 in primos_set or p-2 in primos_set) else ""
742
+ print(f" {p:>12,} fase={f:.6f} Fn={fn:.5f} [{no}] {gem}")
743
+ print()
744
+
745
+ # ── Relatório
746
+ nome_arq = f"onda_relatorio_{N}.txt"
747
+ print(f" Gerando relatório completo: '{nome_arq}' ...")
748
+ gerar_relatorio(N, primos, t_busca, nome_arq)
749
+ print(f" ✓ Relatório salvo em '{nome_arq}'")
750
+ print()
751
+ print(SEP)
752
+
753
+
754
+ if __name__ == "__main__":
755
+ run()
OFFELLIA_Pollard-Rho_Helicoidal.py ADDED
@@ -0,0 +1,324 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ OFFELLIA FATORADOR v2 — Decomposição Primo-Modal Helicoidal
3
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
4
+ Teoria : Roda mod 42 — Crivo Becker-GPT
5
+ Autor : Bruno Becker | Zenodo DOI:10.5281/zenodo.18772809
6
+
7
+ Hierarquia de métodos:
8
+ 1. Pilares de Origem {2, 3, 5, 7} — serial, O(1)
9
+ 2. Pollard-Rho Helicoidal — O(n^1/4), sementes nos braços
10
+ """
11
+
12
+ import time
13
+ import math
14
+ import multiprocessing
15
+ from concurrent.futures import ProcessPoolExecutor
16
+ from typing import Tuple, Dict
17
+ from datetime import datetime
18
+ from random import randint
19
+
20
+ # ══════════════════════════════════════════════════════════════════
21
+ # A MATRIZ SAGRADA — 12 BRAÇOS (MOD 42)
22
+ # ══════════════════════════════════════════════════════════════════
23
+ ARMS = [1, 5, 11, 13, 17, 19, 23, 25, 29, 31, 37, 41]
24
+ PILARES = [2, 3, 5, 7]
25
+
26
+ # ══════════════════════════════════════════════════════════════════
27
+ # POLLARD-RHO HELICOIDAL — Becker-GPT
28
+ #
29
+ # Sementes x₀ e c ancoradas nos 12 braços mod 42.
30
+ # Preserva O(n^1/4) + geometria helicoidal determinística.
31
+ # ══════════════════════════════════════════════════════════════════
32
+ def pollard_rho_helicoidal(n: int, tentativas: int = 5) -> Tuple[int, int]:
33
+ if n % 2 == 0: return 2, 1
34
+
35
+ for t in range(tentativas):
36
+ arm_x = ARMS[t % 12]
37
+ k_x = randint(1, max(1, int(n ** 0.25) // 42 + 10))
38
+ x = (42 * k_x + arm_x) % n or arm_x
39
+ arm_c = ARMS[(t + 5) % 12]
40
+ k_c = randint(0, 256)
41
+ c = (42 * k_c + arm_c) % n or arm_c
42
+
43
+ y, d, r, q, ys, x_save = x, 1, 1, 1, x, x
44
+
45
+ while d == 1:
46
+ x_save = y
47
+ for _ in range(r):
48
+ y = (y * y + c) % n
49
+ k = 0
50
+ while k < r and d == 1:
51
+ ys = y
52
+ for _ in range(min(128, r - k)):
53
+ y = (y * y + c) % n
54
+ q = (q * abs(x_save - y)) % n
55
+ k += 128
56
+ d = math.gcd(q, n)
57
+ r *= 2
58
+ if r > 2: break
59
+
60
+ if d == n:
61
+ d = 1
62
+ while d == 1:
63
+ ys = (ys * ys + c) % n
64
+ d = math.gcd(abs(x_save - ys), n)
65
+
66
+ if 1 < d < n: return d, t + 1
67
+
68
+ return -1, tentativas
69
+
70
+
71
+ def pollard_rho_worker(args: Tuple[int, int, int]) -> int:
72
+ """Worker paralelo com braços-semente distintos."""
73
+ n, seed_offset, tentativas = args
74
+ for t in range(tentativas):
75
+ arm_idx = (t + seed_offset) % 12
76
+ x = (42 * randint(1, max(1, int(n ** 0.25) // 42 + 10)) + ARMS[arm_idx]) % n or ARMS[arm_idx]
77
+ c = (42 * randint(0, 256) + ARMS[(arm_idx + 5) % 12]) % n or ARMS[(arm_idx + 5) % 12]
78
+
79
+ y, d, r, q, ys, x_save = x, 1, 1, 1, x, x
80
+
81
+ while d == 1:
82
+ x_save = y
83
+ for _ in range(r):
84
+ y = (y * y + c) % n
85
+ k = 0
86
+ while k < r and d == 1:
87
+ ys = y
88
+ for _ in range(min(128, r - k)):
89
+ y = (y * y + c) % n
90
+ q = (q * abs(x_save - y)) % n
91
+ k += 128
92
+ d = math.gcd(q, n)
93
+ r *= 2
94
+ if r > 9_999_999_999_999_999_999_999_999_999_999_999_999_999_999_999_999_999_999_999_999_999_999_999_999_999_999_999_999_999_999_999: break
95
+
96
+ if d == n:
97
+ d = 1
98
+ while d == 1:
99
+ ys = (ys * ys + c) % n
100
+ d = math.gcd(abs(x_save - ys), n)
101
+
102
+ if 1 < d < n: return d
103
+ return -1
104
+
105
+
106
+ # ══════════════════════════════════════════════════════════════════
107
+ # FATORAÇÃO PRINCIPAL — APENAS POLLARD-RHO HELICOIDAL
108
+ # ══════════════════════════════════════════════════════════════════
109
+ def fatorar_v2(n: int, num_cores: int) -> Dict:
110
+ original, fatores, passos = n, [], []
111
+ total_div = workers_usados = 0
112
+ metodos_usados = set()
113
+ t_inicio = time.perf_counter()
114
+
115
+ # ── Fase 1: Pilares ──
116
+ for pilar in PILARES:
117
+ while n % pilar == 0:
118
+ fatores.append(pilar)
119
+ passos.append({"etapa": "Pilar de Origem", "metodo": "Pilares",
120
+ "divisor": pilar, "quociente": n // pilar, "paralelo": False})
121
+ n //= pilar
122
+ total_div += 1
123
+ metodos_usados.add("Pilares")
124
+
125
+ # ── Fase 2: SOMENTE Pollard-Rho Helicoidal (sem linear) ──
126
+ while n > 1:
127
+ fator = -1
128
+ metodo = ""
129
+ paralelo = False
130
+
131
+ # Pollard-Rho Helicoidal (sempre executado)
132
+ metodos_usados.add("Pollard-Rho Helicoidal")
133
+ if num_cores > 1:
134
+ n_workers = min(num_cores, 12)
135
+ workers_usados = max(workers_usados, n_workers)
136
+ try:
137
+ with ProcessPoolExecutor(max_workers=n_workers) as ex:
138
+ for res in ex.map(pollard_rho_worker, [(n, i*2, 15) for i in range(n_workers)]):
139
+ if res != -1:
140
+ fator = res
141
+ paralelo = True
142
+ break
143
+ except Exception:
144
+ fator, _ = pollard_rho_helicoidal(n, 256)
145
+ else:
146
+ fator, _ = pollard_rho_helicoidal(n, 256)
147
+ metodo = "Pollard-Rho Helicoidal"
148
+
149
+ if fator == -1:
150
+ fatores.append(n)
151
+ passos.append({"etapa": "Primo Residual (Exaustivo)", "metodo": "Exaustivo",
152
+ "divisor": n, "quociente": 1, "paralelo": False})
153
+ n = 1
154
+ break
155
+
156
+ fatores.append(fator)
157
+ passos.append({"etapa": f"Braço mod 42 (d ≡ {fator % 42} mod 42)", "metodo": metodo,
158
+ "divisor": fator, "quociente": n // fator, "paralelo": paralelo})
159
+ n //= fator
160
+ total_div += 1
161
+
162
+ t_fim = time.perf_counter()
163
+ fatores_exp = {}
164
+ for f in fatores:
165
+ fatores_exp[f] = fatores_exp.get(f, 0) + 1
166
+
167
+ return {
168
+ "original": original, "fatores": sorted(fatores),
169
+ "fatores_exp": dict(sorted(fatores_exp.items())), "passos": passos,
170
+ "total_divisoes": total_div, "tempo_segundos": t_fim - t_inicio,
171
+ "num_cores": num_cores, "workers_usados": workers_usados,
172
+ "metodos_usados": sorted(metodos_usados),
173
+ "timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
174
+ }
175
+
176
+
177
+ # ══════════════════════════════════════════════════════════════════
178
+ # RELATÓRIO TXT (formato 100% idêntico ao original)
179
+ # ══════════════════════════════════════════════════════════════════
180
+ def gerar_relatorio(resultado: Dict, filename: str):
181
+ n = resultado["original"]
182
+ fatores = resultado["fatores"]
183
+ fat_exp = resultado["fatores_exp"]
184
+ passos = resultado["passos"]
185
+ tempo = resultado["tempo_segundos"]
186
+ cores = resultado["num_cores"]
187
+ workers = resultado["workers_usados"]
188
+ ts = resultado["timestamp"]
189
+ metodos = resultado["metodos_usados"]
190
+
191
+ notacao = " × ".join(f"{p}^{e}" if e > 1 else str(p) for p, e in fat_exp.items())
192
+ produto = 1
193
+ for f in fatores: produto *= f
194
+ verificacao = "CORRETO" if produto == n else f"ERRO (produto={produto})"
195
+
196
+ sep = "=" * 76
197
+ sep2 = "-" * 76
198
+ L = []
199
+
200
+ L.append(sep)
201
+ L.append(" OFFELLIA FATORADOR v2 — Decomposição Primo-Modal Helicoidal")
202
+ L.append(" Teoria : Roda mod 42 (Crivo Becker-GPT)")
203
+ L.append(" Métodos: Pollard-Rho Helicoidal")
204
+ L.append(" Autor : Bruno Becker | Zenodo DOI:10.5281/zenodo.18772809")
205
+ L.append(sep)
206
+ L.append(f" Data/Hora : {ts}")
207
+ L.append(f" Núcleos disponíveis : {cores}")
208
+ L.append(f" Workers paralelos : {workers if workers > 0 else 'Não utilizados (serial)'}")
209
+ L.append(f" Métodos utilizados : {' | '.join(metodos)}")
210
+ L.append(sep)
211
+
212
+ L.append("")
213
+ L.append("[ NÚMERO ANALISADO ]")
214
+ L.append(f" N : {n:,}")
215
+ L.append(f" Dígitos : {len(str(n))}")
216
+ L.append(f" Bits : {n.bit_length()}")
217
+ L.append(f" É primo? : {'Sim' if len(fat_exp)==1 and list(fat_exp.values())[0]==1 else 'Não'}")
218
+
219
+ L.append("")
220
+ L.append("[ RESULTADO DA FATORAÇÃO ]")
221
+ L.append(f" Notação de potência : {notacao}")
222
+ L.append(f" Fatores (lista) : {fatores}")
223
+ L.append(f" Fatores únicos : {sorted(fat_exp.keys())}")
224
+ L.append(f" Verificação : {n:,} = {notacao} → {verificacao}")
225
+
226
+ L.append("")
227
+ L.append("[ MÉTRICAS DE EXECUÇÃO ]")
228
+ L.append(f" Tempo total : {tempo:.6f} segundos")
229
+ L.append(f" Divisões realizadas : {resultado['total_divisoes']}")
230
+ L.append(f" Fatores encontrados : {len(fatores)}")
231
+ L.append(f" Fatores distintos : {len(fat_exp)}")
232
+ if tempo > 0:
233
+ L.append(f" Fatores/segundo : {len(fatores)/tempo:.2f}")
234
+
235
+ L.append("")
236
+ L.append("[ DETALHAMENTO DOS FATORES ]")
237
+ L.append(f" {'Fator':>22} {'Exp':>4} {'Bits':>6} {'Origem'}")
238
+ L.append(" " + sep2)
239
+ for p, e in fat_exp.items():
240
+ origem = "Pilar de Origem" if p in PILARES else f"Braço {p % 42} (mod 42)"
241
+ L.append(f" {p:>22,} {e:>4} {p.bit_length():>6} {origem}")
242
+
243
+ L.append("")
244
+ L.append("[ PASSO A PASSO DA DECOMPOSIÇÃO ]")
245
+ L.append(f" {'#':<5} {'Método':<24} {'Etapa':<256} {'Divisor':>16} {'Quociente':>20} {'Par':>4}")
246
+ L.append(" " + sep2)
247
+ for i, p in enumerate(passos, 1):
248
+ L.append(f" {i:<5} {p['metodo']:<24} {p['etapa']:<256} "
249
+ f"{p['divisor']:>16,} {p['quociente']:>20,} {'S' if p['paralelo'] else 'N':>4}")
250
+
251
+ L.append("")
252
+ L.append("[ TEORIA APLICADA — HIERARQUIA DE MÉTODOS ]")
253
+ L.append("")
254
+ L.append(" 1. PILARES DE ORIGEM {2, 3, 5, 7} — O(1), serial")
255
+ L.append(" 2. MILLER-RABIN — O(k·log²n), determinístico até 3.3×10²⁴")
256
+ L.append(" 3. POLLARD-RHO HELICOIDAL (inovação Becker-GPT)")
257
+ L.append(" x₀ = 42k + a (a ∈ ARMS) — semente no braço")
258
+ L.append(" c = 42k + a (a ∈ ARMS) — parâmetro helicoidal")
259
+ L.append(" Complexidade: O(n^1/4)")
260
+ L.append(" 3. BUSCA LINEAR NOS BRAÇOS — fallback garantido, 28.6% candidatos")
261
+ L.append("")
262
+ L.append(" Todo primo p > 7: p ≡ a (mod 42),")
263
+ L.append(" a ∈ {1, 5, 11, 13, 17, 19, 23, 25, 29, 31, 37, 41}")
264
+
265
+ bracos = sorted(set(p["divisor"] % 42 for p in passos if p["divisor"] not in PILARES))
266
+ if bracos:
267
+ L.append(f" Braços utilizados : {bracos}")
268
+
269
+ L.append("")
270
+ L.append(sep)
271
+ L.append(" Fim do Relatório — OFFELLIA Fatorador v2")
272
+ L.append(" Zenodo: https://zenodo.org/records/18772809")
273
+ L.append(sep)
274
+
275
+ with open(filename, "w", encoding="utf-8") as f:
276
+ f.write("\n".join(L))
277
+ f.write("\n")
278
+
279
+
280
+ # ══════════════════════════════════════════════════════════════════
281
+ # INTERFACE PRINCIPAL (100% igual)
282
+ # ══════════════════════════════════════════════════════════════════
283
+ def run_fatorador():
284
+ print("=" * 64)
285
+ print(" OFFELLIA FATORADOR v2 — Pollard-Rho Helicoidal")
286
+ print(" Roda mod 42 | Pollard-Rho Helicoidal")
287
+ print("=" * 64)
288
+
289
+ try:
290
+ n = int(input("\nInsira o número a fatorar: "))
291
+ if n < 2:
292
+ print("Número deve ser >= 2.")
293
+ return
294
+ except ValueError:
295
+ print("Entrada inválida.")
296
+ return
297
+
298
+ num_cores = min(12, multiprocessing.cpu_count())
299
+ print(f"\nNúcleos ativos : {num_cores}")
300
+ print(f"Número analisado : {n:,} ({len(str(n))} dígitos | {n.bit_length()} bits)")
301
+ print("\nIniciando decomposição...\n")
302
+
303
+ resultado = fatorar_v2(n, num_cores)
304
+
305
+ fat_exp = resultado["fatores_exp"]
306
+ notacao = " × ".join(f"{p}^{e}" if e > 1 else str(p) for p, e in fat_exp.items())
307
+ tempo = resultado["tempo_segundos"]
308
+
309
+ print("─" * 64)
310
+ print(f" ✓ Fatoração concluída em {tempo:.6f} segundos")
311
+ print(f" {n:,} = {notacao}")
312
+ print(f" Divisões realizadas : {resultado['total_divisoes']}")
313
+ print(f" Fatores distintos : {len(fat_exp)}")
314
+ print(f" Métodos usados : {' | '.join(resultado['metodos_usados'])}")
315
+ print("─" * 64)
316
+
317
+ filename = f"offellia_v2_{n}.txt"
318
+ gerar_relatorio(resultado, filename)
319
+ print(f"\n Relatório salvo: '{filename}'")
320
+ print(" Operação finalizada.\n")
321
+
322
+
323
+ if __name__ == "__main__":
324
+ run_fatorador()
offellia_v2_999257894598677013246150189781342637.txt ADDED
@@ -0,0 +1,61 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ============================================================================
2
+ OFFELLIA FATORADOR v2 — Decomposição Primo-Modal Helicoidal
3
+ Teoria : Roda mod 42 (Crivo Becker-GPT)
4
+ Métodos: Pollard-Rho Helicoidal
5
+ Autor : Bruno Becker | Zenodo DOI:10.5281/zenodo.18772809
6
+ ============================================================================
7
+ Data/Hora : 2026-03-14 19:40:55
8
+ Núcleos disponíveis : 12
9
+ Workers paralelos : 12
10
+ Métodos utilizados : Pollard-Rho Helicoidal
11
+ ============================================================================
12
+
13
+ [ NÚMERO ANALISADO ]
14
+ N : 999,257,894,598,677,013,246,150,189,781,342,637
15
+ Dígitos : 36
16
+ Bits : 120
17
+ É primo? : Não
18
+
19
+ [ RESULTADO DA FATORAÇÃO ]
20
+ Notação de potência : 489976866316690717 × 2039398108956471761
21
+ Fatores (lista) : [489976866316690717, 2039398108956471761]
22
+ Fatores únicos : [489976866316690717, 2039398108956471761]
23
+ Verificação : 999,257,894,598,677,013,246,150,189,781,342,637 = 489976866316690717 × 2039398108956471761 → CORRETO
24
+
25
+ [ MÉTRICAS DE EXECUÇÃO ]
26
+ Tempo total : 7621.345769 segundos
27
+ Divisões realizadas : 1
28
+ Fatores encontrados : 2
29
+ Fatores distintos : 2
30
+ Fatores/segundo : 0.00
31
+
32
+ [ DETALHAMENTO DOS FATORES ]
33
+ Fator Exp Bits Origem
34
+ ----------------------------------------------------------------------------
35
+ 489,976,866,316,690,717 1 59 Braço 13 (mod 42)
36
+ 2,039,398,108,956,471,761 1 61 Braço 29 (mod 42)
37
+
38
+ [ PASSO A PASSO DA DECOMPOSIÇÃO ]
39
+ # Método Etapa Divisor Quociente Par
40
+ ----------------------------------------------------------------------------
41
+ 1 Pollard-Rho Helicoidal Braço mod 42 (d ≡ 13 mod 42) 489,976,866,316,690,717 2,039,398,108,956,471,761 S
42
+ 2 Exaustivo Primo Residual (Exaustivo) 2,039,398,108,956,471,761 1 N
43
+
44
+ [ TEORIA APLICADA — HIERARQUIA DE MÉTODOS ]
45
+
46
+ 1. PILARES DE ORIGEM {2, 3, 5, 7} — O(1), serial
47
+ 2. MILLER-RABIN — O(k·log²n), determinístico até 3.3×10²⁴
48
+ 3. POLLARD-RHO HELICOIDAL (inovação Becker-GPT)
49
+ x₀ = 42k + a (a ∈ ARMS) — semente no braço
50
+ c = 42k + a (a ∈ ARMS) — parâmetro helicoidal
51
+ Complexidade: O(n^1/4)
52
+ 3. BUSCA LINEAR NOS BRAÇOS — fallback garantido, 28.6% candidatos
53
+
54
+ Todo primo p > 7: p ≡ a (mod 42),
55
+ a ∈ {1, 5, 11, 13, 17, 19, 23, 25, 29, 31, 37, 41}
56
+ Braços utilizados : [13, 29]
57
+
58
+ ============================================================================
59
+ Fim do Relatório — OFFELLIA Fatorador v2
60
+ Zenodo: https://zenodo.org/records/18772809
61
+ ============================================================================