Estoy atascado con la etapa de cribado del algoritmo Quadratic Sieve. He leído un montón de artículos hasta este punto, pero no puedo encontrar ninguna guía de cómo elegir el intervalo de tamizado o cómo se hace el tamizado en realidad, porque lo que he visto hasta ahora es "elegimos un intervalo de tamizado" o "luego tamizamos alrededor de esto".
Esto es lo que he entendido y he hecho (siguiendo el documento de Contini):
-
Digamos que, para N = 90283, calculo el límite $B = e^{(\frac{1}{2} + o(1))(\sqrt{\ln n \ln \ln n})} = 44$ donde tomo $o(1) = 0.22$ (sólo una suposición al azar, supongo). ¿Cuál es la mejor manera de elegir un buen $o(1)$ ?
-
Entonces tomo $C = \lceil \sqrt{N}\rceil = 301$
-
Entonces, usando el Atkin Sieve obtengo una lista de primos $<B$ :
$\{2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43\}$
-
Luego, calculando el símbolo de Jabobi (Legendre) para cada valor de la lista de primos, elijo los primeros no-residuos cuadráticos para obtener la base del factor:
$\{2, 3, 7, 17, 23, 29, 37, 41\}$
-
Luego, utilizando el algoritmo Tonelli-Shanks, calculo las raíces modulares $\pm t$ , donde $t$ es una solución a $t^2 \equiv N \mod{p}$ con $p$ un primo de la base del factor.
-
Entonces obtengo dos matrices de soluciones $sol1 = t - C \mod p$ y $sol2 = - t - C \mod p$ con p's de la base del factor. y también obtener una matriz de logaritmos para p's $l_p = \ln p$ redondeado con cierta precisión, digamos dos dígitos decimales. ¿Cuál es una buena precisión?
sol1 $= \{0, 0, 2, 13, 11, 26, 10, 28\} $
sol2 $= \{0, 1, 5, 14, 8, 10, 17, 26\} $
$l_p$ $= \{0.69, 1.1, 1.95, 2.83, 3.14, 3.37, 3.61, 3.71\}$
Ahora por lo que entiendo tengo que inicializar 'sieving_array' inicializado a 0's, digamos, al tamaño $ = 60$ elementos. Además, ¿cómo debo elegir el tamaño del intervalo de cribado? ¿Existe alguna fórmula similar al límite?
Entonces tengo que añadir los valores de $l_p$ a la matriz de cribado a las posiciones $sol1[j] + i * $ factor_base[j] y $sol1[j] + i *$ factor_base[j], donde $ 0 \le i \le $ tamaño y $ 0 \le j \le |$ factor_base $|$ . Y para la primera $p=2$ añadir $l_p$ sólo a las posiciones con sol1. Así obtengo esta lista (redondeada a dos dígitos decimales):
$\{1.79, 1.1, 2.64, 1.1, 1.79, 1.95, 1.79, 1.1, 3.83, 3.05, 8.77, 3.14, 3.74, 3.93, 3.52, 1.1, 3.74, 3.61, 1.79, 3.05, 0.69, 1.1, 1.79, 1.95, 1.79, 1.1, 9.72, 1.1, 5.5, 0.0, 6.57, 7.07, 0.69, 3.05, 4.93, 0.0, 1.79, 3.05, 0.69, 4.47, 3.74, 0.0, 1.79, 1.1, 2.64, 1.1, 1.79, 8.39, 4.62, 1.1, 0.69, 3.05, 1.79, 0.0, 10.49, 4.47, 0.69, 4.24, 3.74, 0.0\}$
Ahora, tengo que buscar entre los valores de la lista, y si algunos de ellos son al menos $\log(2x \sqrt N)$ esto significa polinomio $g(x)$ puede ser factorizado sobre la base de factores.
Mi pregunta principal es: ¿dónde está este $x$ ¿de dónde viene? Tengo esta lista de valores, pero ¿qué hago con ella? Si tengo un elemento en esta lista, por ejemplo $1.79$ - con lo que $x$ ¿tengo que compararlo? ¿Cómo puedo elegir un buen término de error? ¿Es $x$ posición de $1.79$ ? Si es así, ¿qué valor indica este $1.79$ es factorizable sobre la base de factores?