4 votos

División de polinomio de un super-singular vs ordinario de Curva Elíptica

Para una Curva Elíptica en Campo Finito de característica $p$, estoy tratando de entender cómo la división del polinomio para la multiplicación por el campo característico de la diferencia entre una simple curva y un super-singular de la curva. Si $p$ es el campo de la característica, la multiplicación por $p$ mapa como un isogney está dada por

$$[p] = \left (\frac{\phi_p}{\psi_{p}^2}, \frac{\omega_p}{\psi_p^3}\right)$$

Para el super-singular curvas, $E[p] \cong \{0\}$, y por lo tanto $\psi_p(x)$ no debe tener ceros incluso en la clausura algebraica $\bar{F_p}$. Esto sólo es posible si $\psi_p(x) = c$ para algunas constantes $c$.

Debido a la inseparabilidad razones, en el caso de ordinario curvas, $\psi_p(x) = g(x^p)$, donde $g(t)$ es no-constante polinomio en $F_p[t]$. Además, por las mismas razones, $\phi_p(x)$ también debe ser de la forma $h(x^p)$ para algunos no constante $h(t) \in F_p[t]$.

He intentado validar mi entender, el uso de sagemath, pero ran-en algunas sorpresas: En el caso de super-singular curvas de $\psi_p(x)$ está de acuerdo con lo anterior, y en el hecho de $\psi_p(x)$ parece ser siempre igual a $p-1$. Sin embargo, en el caso de ordinario curvas, no me $\psi_p(x)$ en forma de $g(x^p)$, e $\phi_p(x)$ nunca es en forma de $h(x^p)$ para cualquiera de los super-singular ordinario o curvas.

Me pregunto ¿cómo es esto posible? Aquí está mi sagemath código. ¿Qué estoy haciendo mal?

def nMapIso(curva):
 fp = curva.base_ring()
 c = fp.característica()
 fpBar = fp.algebraic_closure()
 PR.<X> = PolynomialRing(fpBar, 'X')
 divP_Plus_1 = PR(curva.division_polynomial(c+1).lista());
 divP_minus_1 = PR(curva.division_polynomial(c-1).lista());
 divP = PR(curva.division_polynomial(c).lista());
 num = X*divP*divP - divP_Plus_1*divP_minus_1
 den = divP*divP
 retorno (num/den)

def listSuperSingulars(campo):
 c = campo.característica() - 1
 for i in [0..c]:
 para j en [0..c]:
 Dimm_4 = campo(4)
 _27 = campo(-27)
 A = campo(i)
 B = campo(j)
 si dimm_4*a*a*A == _27*B*B :
continuar
 e = EllipticCurve(campo, [a,B]);
 si el correo.is_supersingular():
 imprimir "========= Super Singular ========"
 de torsión = nMapIso(e)
 de impresión ([a,B],torsión)
otra cosa:
 imprimir "============= Ordinario ==========="
 de torsión = nMapIso(e)
 de impresión ([a,B],torsión)
 imprimir "=================================="
P=5
Fp=GF(P)
listSuperSingulars(Fp)

Y aquí está el resultado

========= Super Singular ========
([0, 4], 4*X^28 + X^25 + X^4)
==================================
============= Ordinario ===========
([1, 0], (4*X^28 + 4*X^26 + 4*X^24 + 4*X^22 + 4*X^21 + X^18 + X^16 + 4*X^14 + 4*X^12 + 4*X^11 + X^8 + X^6 + X^4 + X^2 + X)/(4*X^20 + 4*X^10 + 1))
==================================

3voto

RobChem Puntos 169

He encontrado el problema. El division_polynomial en sagemath no devuelvan los reales de la división de polinomio por defecto! (Bueno, duh, $\psi_2=2y$ que no puede ser expresado como $f(x)$, por lo que, en retrospectiva, este debería haber sido obvio...)

Para obtener la real división de polinomio uno tiene que llamar a division_polynomial con two_torsion_multiplicity a 1. (La documentación es un poco oscuro.) Por supuesto, esto tiene onu-reducción de $y^{2m}$ términos, que debe ser reducido a $(x^3+Ax+B)^m$.

Con este cambio, de super-singular curvas de $[p] = (x^{p^2},y^{p^2},1)$ y para el común de las curvas de $\psi_p(x)$ es un polinomio de la forma $g(x^p)$, donde el grado de $g(x)$ es un múltiplo de a$p$.

Aquí están los cambios en la secuencia de comandos (listSuperSingulars es el mismo que antes).

def normalizar(polyList, fx):
 const_term = 0
 y_term = 0

 para i, v en enumerar(polyList):
 xterm = polyList[i]
 si i % 2 == 0:
 expo = int(i/2)
 const_term = const_term + xterm * (fx ^ expo) 
otra cosa:
 expo = int(int(i-1)/2)
 y_term = y_term + xterm * (fx ^ expo)

 retorno (y_term,const_term)


def nMapIso(curva):
 A,B = curva.a4(), de la curva.a6()
 fp = curva.base_ring()
 c = fp.característica()
 divP_Plus_1 = curva.division_polynomial(c+1,two_torsion_multiplicity=1)
 divP_minus_1 = curva.division_polynomial(c-1,two_torsion_multiplicity=1)
 divP = curva.division_polynomial(c,two_torsion_multiplicity=1)
 (X,Y) = divP_Plus_1.variables()
 num = (X*divP*divP - divP_Plus_1*divP_minus_1).el polinomio(Y).lista()
 den = (divP*divP).el polinomio(Y).lista()
 fx = X^3+a*X+B;
 (numY,numC) = normalizar(num, fx)
 (negar,denC) = normalizar(den, fx)
 return ((numC + Y*numY)/(denC + Y*negar))

Aquí está la muestra de la salida

========= Super Singular ========
([1, 0], x^49)
==================================
============= Ordinario ===========
([1, 1], (x^49 + 2*x^42 - x^35 - x^28 - 3*x^7 + 1)/(2*x^42 - 3*x^35 + 2*x^28 - 2*x^21 - 2*x^14 - 3))
==================================

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X