Files
OFFELLIA_Quantis/SACRED_TOTIENT_42Fn.py
ModelHub XC 86836ec189 初始化项目,由ModelHub XC社区提供模型
Model: Brunobkr/OFFELLIA_Quantis
Source: Original Platform
2026-08-11 10:11:17 +08:00

151 lines
3.5 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import os
import math
import numpy as np
import matplotlib.pyplot as plt
from math import sin, pi, sqrt
from collections import defaultdict
# ===============================
# CONFIGURAÇÕES FUNDAMENTAIS
# ===============================
PHI = (1 + sqrt(5)) / 2
MOD = 42
BRACOS_42 = list(range(42))
# ===============================
# UTILIDADES
# ===============================
def is_prime(n):
if n < 2:
return False
for i in range(2, int(sqrt(n)) + 1):
if n % i == 0:
return False
return True
def helicoidal_fn(n, r):
x = (n - r) / MOD
return sin(2 * pi * PHI * x) ** 2
# ===============================
# ENTRADA DO USUÁRIO
# ===============================
N = int(input("Limite máximo N (ex: 100000): "))
IGNORE_PRIMES = input("Ignorar primos? (s/n): ").lower() == "s"
EXPORT_TXT = input("Exportar dados TXT? (s/n): ").lower() == "s"
# ===============================
# PREPARAÇÃO DE PASTAS
# ===============================
BASE_DIR = "SACRED_TOTIENT_V2_OUTPUT"
SUBDIRS = ["plots_2D", "plots_3D", "plots_fractal", "data_txt"]
for d in SUBDIRS:
os.makedirs(os.path.join(BASE_DIR, d), exist_ok=True)
# ===============================
# CÁLCULO PRINCIPAL
# ===============================
dados = []
por_braco = defaultdict(list)
for n in range(1, N + 1):
r = n % 42 # braço geométrico real (0..41)
fn = helicoidal_fn(n, r)
theta = 2 * pi * r / 42
raio = fn
z = n
dados.append((n, r, fn, theta, raio, z))
por_braco[r].append((n, fn, theta, raio, z))
# ===============================
# GRÁFICOS 2D GERAIS
# ===============================
ns = [d[0] for d in dados]
fns = [d[2] for d in dados]
plt.figure()
plt.scatter(ns, fns, s=1)
plt.title("Distribuição Global Fn")
plt.xlabel("n")
plt.ylabel("Fn")
plt.savefig(f"{BASE_DIR}/plots_2D/Fn_global.png")
plt.close()
# ===============================
# GRÁFICOS POR BRAÇO
# ===============================
for r, vals in por_braco.items():
ns_r = [v[0] for v in vals]
fns_r = [v[1] for v in vals]
plt.figure()
plt.scatter(ns_r, fns_r, s=2)
plt.title(f"Fn - Braço r={r}")
plt.xlabel("n")
plt.ylabel("Fn")
plt.savefig(f"{BASE_DIR}/plots_2D/Fn_braco_{r}.png")
plt.close()
# ===============================
# HÉLICE 3D GLOBAL
# ===============================
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
xs = [d[3] * math.cos(d[3]) for d in dados]
ys = [d[3] * math.sin(d[3]) for d in dados]
zs = [d[5] for d in dados]
ax.scatter(xs, ys, zs, s=1)
ax.set_title("Hélice Helicoidal Global Fn")
ax.set_xlabel("X")
ax.set_ylabel("Y")
ax.set_zlabel("n")
plt.savefig(f"{BASE_DIR}/plots_3D/helice_global.png")
plt.close()
# ===============================
# FRACTAL ZOOM LOCAL
# ===============================
zoom_lim = min(N, 230539333248)
zoom_ns = ns[:zoom_lim]
zoom_fns = fns[:zoom_lim]
plt.figure()
plt.scatter(zoom_ns, zoom_fns, s=2)
plt.title("Zoom Fractal Inicial Fn")
plt.xlabel("n")
plt.ylabel("Fn")
plt.savefig(f"{BASE_DIR}/plots_fractal/zoom_fractal_inicial.png")
plt.close()
# ===============================
# EXPORTAÇÃO TXT
# ===============================
if EXPORT_TXT:
with open(f"{BASE_DIR}/data_txt/dados_completos.txt", "w") as f:
f.write("n,r,Fn,theta,raio,z\n")
for d in dados:
f.write(",".join(map(str, d)) + "\n")
print("\n=== SACRED TOTIENT FN HELICOIDAL V2 FINALIZADO ===")
print(f"Total de pontos analisados: {len(dados)}")
print("Resultados salvos em:", BASE_DIR)