A resposta a seguir foi postada originalmente como um comentário no blog de Gil
(1) Seja um campo numérico, onde assumimos que α possui um polinômio mínimo monônico f ∈ Z [ x ] . Pode-se então representar elementos do anel de números inteiros O K como polinómios em α ou em termos de uma base integrante - os dois são equivalentes.K=Q(α)αf∈Z[x]OKα
Agora fixação como em (1) há uma redução em tempo polinomial do problema ao longo do K para o problema em Q . Verificar se os cálculos (por exemplo, cruzando um ideal com Z ou fatorando um mod polinomial pKKQZp ) podem ser feitos em tempo polinomial, consulte o livro de Cohen mencionado na resposta anterior.
Como precomputation para cada imunização racional dividindo o discriminante de α (que é o discriminante F ) encontrar todos os números primos de O K encontra-se acima de p .pαfOKp
(2) Para o ensaio primality, dado um ideal deixar p ∈ Z ser tal que uma ∩ Z = P Z (isto pode ser calculado em tempo polinomial e o número de bits de p é polinomial na entrada). Verifique no tempo polinomial se p é primo. Caso contrário, a não é primo. Se sim, então encontrar os primos de O K deitado acima p a partir do precomputation ou por factoring f mod p . De qualquer forma, se uma◃OKp∈Za∩Z=pZppaOKpfpa é primo, deve ser um desses primos.
(3a), (6a) Para fatorar em primos, dado um ideal encontre sua norma y = N K Q ( a ) = [ O K : a ] . Novamente, isso pode ser encontrado no tempo polinomial e, consequentemente, não é muito grande. Fator y em Z (classicamente ou usando o algoritmo de Shor, dependendo da redução desejada). Isto dá uma lista de números primos racionais divisão y , e, portanto, como em 2 podemos encontrar a lista de números primos de O K dividindo y . Desde a | ya◃OKy=NKQ(a)=[OK:a]yZyOKy isso dá a lista de números primos que dividem um . Finalmente, é fácil determinar o expoente ao qual um primo divide um dado ideal.a|yOKa
(3b), (6b) Mas Gil quer a fatoração em irredutíveis, não em primos. Acontece que, dada a fatoração principal de é possível construir de forma eficiente uma fatoração de x em elementos irredutíveis de O K . Para isso vamos h K ser o número da classe, e nota que é possível calcular de forma eficiente a classe ideal de um determinado ideal. Agora, para encontrar um divisor irredutível de x, selecione h K ideais ideais (possivelmente com repetição) a partir da fatoração dexOKxOKhKxhKx. Pelo princípio do buraco do pombo, algum subconjunto desses se multiplica à identidade no grupo de classes; encontre um subconjunto mínimo. Seu produto é então o principal ideal gerado por um elemento irredutível. Divida por esse elemento, remova os ideais relevantes da fatoração e repita. Se a fatoração tiver menos de h KxhK elementos , basta pegar um subconjunto mínimo de todos os fatores.
(4) Eu acho que é possível contar as fatorações em irredutíveis, mas isso é um pouco de combinatória extra - por favor, me dê tempo para resolver isso. Por outro lado, determinar todos eles não é interessante no contexto de algoritmos de fatoração subexponencial, uma vez que, em geral, existem exponencialmente muitas dessas fatorações.
(5) não faço ideia.