Représentant des nombres d'Eisenstein sans flotteurs

9

J'ai un projet où j'ai besoin d'utiliser des champs quadratiques Plus précisément des nombres de la forme a+b3 aveca,bQ.

Par exemple, voici les nombres premiers en entiers d'Eisenstein :

Je ne veux pas utiliser de sauge. Je voudrais écrire mon propre type de données à incorporer numpy. PARI serait utile - mais il n'est pas compatible avec Python.

  • L'addition pour ces objets est assez claire
    (a1+b13)+(a2+b23)=(une1+une2)+(b1+b2)-3
  • La multiplication est un peu plus délicate mais on peut aussi la coder en dur
    (une1+b1-3)×(une2+b2-3)=(une1une2-3b1b2)+(une1b2+une2b1)-3
  • Mon type de données doit également s'adapter à la division. Pour plus de simplicité, prenons l'inverse:
    1une+b-3=une-b-3une2+3b2

Existe-t-il un moyen naturel basé sur une matrice de coder ces opérations, semblable à la façon dont peut être écrit en termes de matrices 2 × 2 ?C2×2

(uneb-bune)

Peut-être que je vais coder en dur les opérations en triples avec les trois opérations décrites ci-dessus. Des idées?

John mangual
la source

Réponses:

10

Pour vous pouvez utiliser la représentation ( a - 3 b b a ) L' addition fonctionne évidemment. Pour la multiplication, vous pouvez vérifier ( 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 bune+b-3

(une-3bbune)
qui préserve la représentation, nous avons donc un homomorphisme cyclique.
(une1-3b1b1une1)(une2-3b2b2une2)=(une1une2-3b1b2-3(une1b2+b1une2)une1b2+b1une2une1une2-3b1b2)

La prise du déterminant de la matrice donne la norme (au carré) , donc les inverses correspondent aux matrices inverses, comme prévu.une2+3b2

Vous avez déjà envisagé d'utiliser des triplets , par lesquels je suppose que vous utiliseriez des entiers et un dénominateur commun. Cette approche peut également être utile dans la représentation matricielle.

Mise à jour : une méthode générale pour les représentations matricielles utilise la matrice associée . Par exemple, supposons que vous vouliez représenter place où ω = exp ( 2 π iune+bω, doncω2+ω+1=0. La matrice compagnon deωest( 0 - 1 1 - 1 ), et cela se comporte dans toutes ses opérations d'anneau associées commeωlui-même. Bien sûr,1peut être représenté par( 1 0 0 1 ); donc une représentation matricielle dea+bωest ( a - b b a - b )ω=exp(2πje3)ω2+ω+1=0ω(0-11-1)ω1(1001)une+bω

(une-bbune-b)
Vous voudrez peut-être vérifier qu'il s'agit d'un homomorphisme en anneau. De plus, cela est facile à voir. Pour la multiplication, les formules correspondantes sont maintenant
(une1+b1ω)(une2+b2ω)=(une1une2-b1b2)+(une1b2+b1une2-b1b2)ω(une1-b1b1une1-b1)(une2-b2b2une2-b2)=(une1une2-b1b2-(une1b2+b1une2-b1b2)une1b2+b1une2-b1b2une1une2-une1b2-b1une2)
ccorn
la source
2

1/zQ[-3]z

Peu importe comment vous représentez les éléments de votre champ, vous pouvez surcharger les opérateurs en Python en utilisant des "méthodes magiques". Voir également ce billet SO sur la création de votre propre type numérique en Python.

Je ne pense pas qu'il y aurait beaucoup plus de travail à coder une représentation d'un élément d'un champ quadratique soit comme une matrice 2 x 2 de nombres rationnels ou comme une paire de nombres rationnels, car les opérations arithmétiques ne sont pas si compliquées. Cependant, je soupçonne que la deuxième approche sera plus rapide.

Daniel Shapero
la source
1
Il peut être intéressant de comparer les performances pratiques des numpyopérations matricielles accélérées avec celles des types de données définis par l'utilisateur. Je ne sais pas quel serait le gagnant.
ccorn
Oui c'est vrai, numpy a beaucoup d'optimisations Cython + codées à la main du côté C pour accélérer les choses. Vous devriez refaire une partie de cela vous-même pour obtenir le même effet. Néanmoins, la fonctionnalité doit venir en premier et plus tard, on peut se soucier de la vitesse.
Daniel Shapero