Representando números de Eisenstein sin flotadores

9

Tengo un proyecto donde necesito usar campos cuadráticos Específicamente números de la forma una+si-3 conuna,siQ.

Por ejemplo, aquí están los números primos en enteros de Eisenstein :

No quiero usar salvia. Me gustaría escribir mi propio tipo de datos para incorporar numpy. PARI sería útil, pero no es compatible con Python.

  • La adición de estos objetos es bastante clara
    (una1+si1-3)+(una2+si2-3)=(una1+una2)+(si1+si2)-3
  • La multiplicación es un poco más delicada, pero también podemos codificarla
    (una1+si1-3)×(una2+si2-3)=(una1una2-3si1si2)+(una1si2+una2si1)-3
  • Mi tipo de datos también necesita acomodar la división. Por simplicidad tomemos el recíproco:
    1una+si-3=una-si-3una2+3si2

¿Existe una forma natural basada en matrices para codificar estas operaciones, similar a cómo se puede escribir en términos de matrices 2 × 2 ?C2×2

(unasi-siuna)

Tal vez simplemente codifique las operaciones como triples con las tres operaciones descritas anteriormente. ¿Algunas ideas?

john mangual
fuente

Respuestas:

10

puede usar la representación ( a - 3 b b a ) La suma funciona obviamente. Para la multiplicación, puede verificar ( a 1 - 3 b 1 b 1 a 1 ) ( a 2 - 3 b 2 b 2 a 2 ) = ( a 1 a 2 - 3 b 2 + b 1 a 2 ) a 1una+si-3

(una-3sisiuna)
(una1-3si1si1una1)(una2-3si2si2una2)=(una1una2-3si1si2-3(una1si2+si1una2)una1si2+si1una2una1una2-3si1si2)

una2+3si2

Ya has considerado usar triples , por lo que supongo que usarías números enteros y un denominador común. Ese enfoque también puede ser útil en la representación matricial.

una+siωω=Exp(2πyo3)ω2+ω+1=0 0ω(0 0-11-1)ω1(10 00 01)una+siω

(una-sisiuna-si)
(una1+si1ω)(una2+si2ω)=(una1una2-si1si2)+(una1si2+si1una2-si1si2)ω(una1-si1si1una1-si1)(una2-si2si2una2-si2)=(una1una2-si1si2-(una1si2+si1una2-si1si2)una1si2+si1una2-si1si2una1una2-una1si2-si1una2)
ccorn
fuente
2

1/ /zQ[-3]z

No importa cómo represente los elementos de su campo, puede sobrecargar operadores en Python usando "métodos mágicos". Vea también esta publicación SO sobre cómo crear su propio tipo numérico en Python.

No creo que haya mucho más trabajo codificando una representación de un elemento de un campo cuadrático como una matriz 2 x 2 de números racionales o como un par de números racionales, ya que las operaciones aritméticas no son tan complicadas. Sin embargo, sospecho que el segundo enfoque será más rápido.

Daniel Shapero
fuente
1
Puede ser interesante comparar el rendimiento práctico de numpylas operaciones matriciales aceleradas con las de los tipos de datos definidos por el usuario. No estoy seguro de cuál sería el ganador.
ccorn
Sí, eso es cierto, numpy tiene muchas optimizaciones codificadas a mano Cython + en el lado C para hacer las cosas más rápido. Tendría que rehacer algo de eso usted mismo para lograr el mismo efecto. Sin embargo, la funcionalidad debe venir primero y luego uno puede preocuparse por la velocidad.
Daniel Shapero