Rappresenta i numeri di Eisenstein senza galleggianti


9

Ho un progetto in cui devo usare i campi quadratici In particolare i numeri del modulo con . a,bQun'+B-3un',BQ

Ad esempio, ecco i numeri primi negli interi di Eisenstein :

Non voglio usare la salvia. Vorrei scrivere il mio tipo di dati da incorporare numpy. PARI sarebbe utile, ma non è compatibile con Python.

  • L'aggiunta di questi oggetti è abbastanza chiara
    (un'1+B1-3)+(un'2+B2-3)=(un'1+un'2)+(B1+B2)-3
  • La moltiplicazione è un po 'più delicata ma possiamo anche codificarla
    (un'1+B1-3)×(un'2+B2-3)=(un'1un'2-3B1B2)+(un'1B2+un'2B1)-3
  • Il mio tipo di dati deve anche adattarsi alla divisione. Per semplicità prendiamo il reciproco:
    1un'+B-3=un'-B-3un'2+3B2

Esiste un modo naturale basato su matrice per codificare queste operazioni, simile a come può essere scritto in termini di matrici ? 2 × 2C2×2

(un'B-Bun')

Forse potrò semplicemente codificare le operazioni come triple con le tre operazioni descritte sopra. Qualche idea?

Risposte:


10

Per puoi usare la rappresentazione ( a - 3 b b a ) L' aggiunta funziona ovviamente. Per la moltiplicazione, è possibile verificare ( a 1 - 3 b 1 b 1 a 1 ) ( a 2 - 3 b 2 b 2 a 2 ) = ( a 1 a 2 - 3 b 1 b 2 - 3 ( a 1 bun'+B-3

(un'-3BBun')
che conserva la rappresentazione, quindi abbiamo un omomorfismo ad anello.
(un'1-3B1B1un'1)(un'2-3B2B2un'2)=(un'1un'2-3B1B2-3(un'1B2+B1un'2)un'1B2+B1un'2un'1un'2-3B1B2)

Prendere il determinante della matrice dà alla norma (quadrata) , quindi i reciproci corrispondono alle matrici inverse, come previsto.un'2+3B2

Hai già preso in considerazione l'uso delle triple , con le quali suppongo che useresti numeri interi e un denominatore comune. Tale approccio può essere utile anche nella rappresentazione matriciale.

Aggiornamento : un metodo generale per le rappresentazioni di matrici utilizza la matrice di accompagnamento . Ad esempio, supponiamo di voler rappresentare invece dove ω = exp ( 2 π iun'+Bω, quindiω2+ω+1=0. La matrice compagna diωè( 0 - 1 1 - 1 ), e questo si comporta in tutte le sue operazioni ad anello associate comeωstesso. Naturalmente,1può essere rappresentato come( 1 0 0 1 ); pertanto una rappresentazione matriciale dia+bωè ( a - b b a - b )ω=exp(2πio3)ω2+ω+1=0ω(0-11-1)ω1(1001)un'+Bω

(un'-BBun'-B)
Potresti voler verificare che si tratti di un omomorfismo ad anello. Inoltre, questo è facile da vedere. Per la moltiplicazione, le formule corrispondenti sono ora
(un'1+B1ω)(un'2+B2ω)=(un'1un'2-B1B2)+(un'1B2+B1un'2-B1B2)ω(un'1-B1B1un'1-B1)(un'2-B2B2un'2-B2)=(un'1un'2-B1B2-(un'1B2+B1un'2-B1B2)un'1B2+B1un'2-B1B2un'1un'2-un'1B2-B1un'2)

2

1/zQ[-3]z

Indipendentemente da come rappresenti gli elementi del tuo campo, puoi sovraccaricare gli operatori in Python usando "metodi magici". Vedi anche questo post SO sulla creazione del tuo tipo numerico in Python.

Non penso che ci sarebbe molto più lavoro che codifica una rappresentazione di un elemento di un campo quadratico o come una matrice 2 x 2 di numeri razionali o come una coppia di numeri razionali, poiché le operazioni aritmetiche non sono così complicate. Tuttavia, sospetto che il secondo approccio sarà più veloce.


1
Potrebbe essere interessante confrontare le prestazioni pratiche delle numpyoperazioni a matrice accelerata con quelle dei tipi di dati definiti dall'utente. Non sono sicuro di quale sarebbe il vincitore.
ccorn

Sì, è vero, numpy ha molte ottimizzazioni Cython + codificate a mano sul lato C per rendere le cose più veloci. Dovresti rifare un po 'di tutto questo per ottenere lo stesso effetto. Tuttavia, la funzionalità dovrebbe venire prima e dopo ci si può preoccupare della velocità.
Daniel Shapero,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.