Hola
Lo he expuesto, el problema, en Mathforums.
https://mathforums.com/t/visual-structural-signatures-for-prime-number-detection.373906/
Aquí el foro estaba saturado y me costaba contestar y me estaba liando, y también para darle más visibilidad por si alguien ve algo interesante.
Últimamente (desde el lunes) el foro está presentando problemas de conexión; estamos trabajando en su solución.
Por otra parte has vuelto a borrar cosas que habías escrito. Eso dificulta seguirte y responderte. En cualquier caso creo que lo esencial de lo que haces ya lo he comentado en mi última respuesta.
Saludos.
Desde luego, es un fallo mío, quiero poner el mensaje lo mejor posible, veo que no es el mejor mensaje, y lo borro, si no me han contestado, para intentar expresarlo mejor o rectificar.

He puesto en el enlace, (en el hilo del otro foro), el código mejorado, y el método de cálculo (más formal, con transformadas de fourier) con unos ejemplos de primos, ilustrados.
Es verdad que la esencia es trivial, pero el concepto de firma y distinción visual de cada número entre primo y compuesto, ¿puede ser algo no trivial? Eso es lo que me pregunto.
Gracias, saludos.
Añado:"Es una técnica de Primalidad Basada en Firmas Espectrales, que utiliza la Transformada de Fourier para evaluar la coherencia de las órbitas de los residuos cuadráticos en el grupo multiplicativo de los enteros módulo N."
Código última versión (Al final, lo pongo, soy generoso

):
Spoiler
function [es_primo, metrica_final] = analizador_primalidad_visual_v9(N_str)
t_proceso = tic; % Inicio del cronómetro
% 1. Preparación de BigInteger
N = java.math.BigInteger(N_str);
uno = java.math.BigInteger.ONE;
dos_bi = java.math.BigInteger('2');
mil_bi = java.math.BigInteger('1000000');
% Descomposición N-1 = 2^s * d
d = N.subtract(uno); s = 0;
while d.remainder(dos_bi).equals(java.math.BigInteger.ZERO)
d = d.divide(dos_bi); s = s + 1;
end
% 2. Muestreo de multifrecuencia (Bases optimizadas)
bases = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47];
registro_fase = [];
for a = bases
if N.compareTo(java.math.BigInteger(num2str(a))) <= 0, break; end
x = java.math.BigInteger(num2str(a)).modPow(d, N);
% Fase inicial escalada
f_i = x.multiply(mil_bi).divide(N).doubleValue() / 1000000;
registro_fase(end+1) = f_i;
for r = 1:(s-1)
x = x.multiply(x).remainder(N);
dist = x.subtract(N.subtract(uno)).abs().min(x.subtract(uno).abs());
f_evol = dist.multiply(mil_bi).divide(N).doubleValue() / 1000000;
registro_fase(end+1) = f_evol;
if x.equals(uno), break; end
end
end
% --- 3. ANÁLISIS DE SEÑAL Y MÉTRICAS ---
L = length(registro_fase);
tiempo_total = toc(t_proceso); % Captura del tiempo
% FFT Normalizada
sig = registro_fase - mean(registro_fase);
espectro = abs(fft(sig)) / L;
resonancia = max(espectro);
if isempty(resonancia) || resonancia == 0, resonancia = 1e-6; end
% Métrica de Estabilidad (Varianza de fase)
% Un primo tiene una distribución de fases armónica, un compuesto es caótico.
estabilidad = std(registro_fase);
% Métrica Híbrida V9 (Cuanto más baja, más "Primo")
metrica_final = (estabilidad) / (1 + resonancia * sqrt(L));
% --- 4. RESULTADOS EN CONSOLA ---
fprintf('\n============================================\n');
fprintf(' ANALIZADOR DE ENERGÍA ESTRUCTURAL V9\n');
fprintf('============================================\n');
fprintf('N (dígitos): %d\n', length(N_str));
fprintf('Tiempo de cómputo: %.6f segundos\n', tiempo_total);
fprintf('Métrica de Energía: %.12f\n', metrica_final);
% Umbral adaptativo para números grandes y Mersenne
% Sustituye la sección del umbral en tu V9 por esta:
if s < 3
umbral_dinamico = 0.15; % Los Mersenne son más "ruidosos" por falta de s
else
umbral_dinamico = 0.10; % Números estándar
end
if metrica_final < umbral_dinamico
fprintf('VEREDICTO: [PRIMO POSIBLE] - Resonancia detectada.\n');
es_primo = true;
else
fprintf('VEREDICTO: [COMPUESTO] - Disonancia estructural.\n');
es_primo = false;
end
% --- 5. VISUALIZACIÓN DE LA FIRMA ---
figure('Color', 'w', 'Name', ['Firma Energética - ', N_str(1:min(8,end)), '...']);
% Subplot 1: Firma Temporal
subplot(2,1,1);
plot(registro_fase, '-o', 'Color', [0.2 0.6 0.8], 'MarkerFaceColor', [0.2 0.6 0.8], 'LineWidth', 1.2);
title(['Firma Energética (t = ', num2str(tiempo_total, '%.4f'), 's)']);
ylabel('Amplitud de Fase'); grid on;
% Subplot 2: Análisis de Resonancia
subplot(2,1,2);
area(espectro, 'FaceColor', [0.8 0.3 0.3], 'EdgeAlpha', 0.5);
title(['Resonancia Espectral (FFT) - Métrica: ', num2str(metrica_final, '%.6f')]);
ylabel('Magnitud'); xlabel('Frecuencia'); grid on;
% Añadir texto con tiempo exacto en la gráfica
text(0.02, 0.9, ['Tiempo total: ', num2str(tiempo_total), ' s'], 'Units', 'normalized', 'FontWeight', 'bold');
end
%-----Como indicar los comandos----%
%Copiar despues de *
%A:
% 1. Construimos el número: un '1', seguido de 597 ceros, y luego '2117357'
%*n_str = ['1', repmat('0', 1, 597), '2117357'];
% 2. Lo enviamos al analizador
%*analizador_primalidad_visual_v9(n_str);
%----
%B:
%*analizador_primalidad_visual_v9('');
%C:
% Asegúrate de usar formato largo para no perder precisión
%*valor_real = char(str2sym('2^607 - 1'));
%*analizador_primalidad_visual_v9(valor_real)
Ejemplos del visualizador:
(c) Primo 173:

(bb1) Compuesto 999999991:

Pregunta de examen: ¿Qué dirías sobre éste número simplemente viendo este gráfico? ¿Es primo o compuesto?
