Representando números Eisenstein sem flutuadores


9

Eu tenho um projeto em que preciso usar campos quadráticos Especificamente, números do formulário com .a+b3a,bQ

Por exemplo, aqui estão os números primos nos números inteiros de Eisenstein :

Eu não quero usar sálvia. Eu gostaria de escrever meu próprio tipo de dados para incorporar numpy. O PARI seria útil - mas não é compatível com o Python.

  • A adição para esses objetos é bem clara
    (uma1 1+b1 1-3)+(uma2+b2-3)=(uma1 1+uma2)+(b1 1+b2)-3
  • A multiplicação é um pouco mais delicada, mas também podemos codificá-la
    (uma1 1+b1 1-3)×(uma2+b2-3)=(uma1 1uma2-3b1 1b2)+(uma1 1b2+uma2b1 1)-3
  • Meu tipo de dados também precisa acomodar a divisão. Por simplicidade, tomemos o recíproco:
    1 1uma+b-3=uma-b-3uma2+3b2

Existe uma maneira natural baseada em matriz de codificar essas operações, semelhante à forma como pode ser escrita em termos de matrizes? 2 × 2C2×2

(umab-buma)

Talvez eu apenas codifique as operações como triplas com as três operações descritas acima. Alguma ideia?

Respostas:


10

Para você pode usar a representação adição funciona obviamente. Para multiplicação, você pode verificar que preserva a representação, portanto, temos um homomorfismo em anel. ( a - 3 b b a ) ( a 1 - 3 b 1 b 1 a 1 ) ( a 2 - 3 b 2 b 2 a 2 ) = ( a 1uma+b-3

(uma-3bbuma)
(uma1 1-3b1 1b1 1uma1 1)(uma2-3b2b2uma2)=(uma1 1uma2-3b1 1b2-3(uma1 1b2+b1 1uma2)uma1 1b2+b1 1uma2uma1 1uma2-3b1 1b2)

Tomando o determinante da matriz, obtém-se a norma (ao quadrado) , portanto os recíprocos correspondem a matrizes inversas, conforme o esperado.uma2+3b2

Você já pensou em usar triplos , pelo que suponho que usaria números inteiros e um denominador comum. Essa abordagem também pode ser útil na representação matricial.

Atualização : Um método geral para representações de matriz usa a matriz associada . Por exemplo, suponha que você queira representar vez de onde , assim . A matriz complementar de é , e isso se comporta em todas as suas operações de anel associadas, como o próprio . Obviamente, pode ser representado como ; portanto, uma representação matricial de é ω = exp ( 2 π iuma+bωω=exp(2πEu3)ω2+ω+1 1=0 0ω(0 0-1 11 1-1 1)ω1 1(1 10 00 01 1)uma+bω

(uma-bbuma-b)
Você pode verificar se esse é um homomorfismo em anel. Além disso, isso é fácil de ver. Para multiplicação, as fórmulas correspondentes agora são
(uma1 1+b1 1ω)(uma2+b2ω)=(uma1 1uma2-b1 1b2)+(uma1 1b2+b1 1uma2-b1 1b2)ω(uma1 1-b1 1b1 1uma1 1-b1 1)(uma2-b2b2uma2-b2)=(uma1 1uma2-b1 1b2-(uma1 1b2+b1 1uma2-b1 1b2)uma1 1b2+b1 1uma2-b1 1b2uma1 1uma2-uma1 1b2-b1 1uma2)

2

Suponho que você queira aritmética racional exata para tudo, pois erros de ponto flutuante podem fazer com que não esteja em mesmo que seja. Para isso, você pode dar uma olhada no pacote SymPy ; se você não usar o tipo de dados racional deles diretamente, isso poderá servir de inspiração para sua própria versão manual. Você pode então construir seu tipo de campo quadrático sobre qualquer tipo de número racional que escolher.1 1/zQ[-3]z

Não importa como você representa os elementos do seu campo, você pode sobrecarregar os operadores no Python usando "métodos mágicos". Veja também este post do SO sobre como criar seu próprio tipo numérico em Python.

Eu não acho que haveria muito mais trabalho codificando uma representação de um elemento de um campo quadrático como uma matriz 2 x 2 de números racionais ou como um par de números racionais, uma vez que as operações aritméticas não são tão complicadas. No entanto, suspeito que a segunda abordagem será mais rápida.


11
Pode ser interessante comparar o desempenho prático das numpyoperações da matriz acelerada com as dos tipos de dados definidos pelo usuário. Não tenho certeza sobre o que o vencedor seria.
Ccorn

Sim, isso é verdade, o numpy tem muitas otimizações codificadas à mão pelo Cython + no lado C para tornar as coisas mais rápidas. Você precisaria refazer parte disso para obter o mesmo efeito. No entanto, a funcionalidade deve vir primeiro e depois é possível se preocupar com a velocidade.
Daniel Shapero
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.