Polinômios primos


21

Dado um polinômio, determine se é primo.

Um polinômio é ax^n + bx^(n-1) + ... + dx^3 + ex^2 + fx + g, onde cada termo é um número constante (o coeficiente) multiplicado por uma potência inteira não negativa de x. A potência mais alta com um coeficiente diferente de zero é chamada de grau. Para esse desafio, consideramos apenas polinômios de pelo menos grau 1. Ou seja, cada polinômio contém alguns x. Além disso, usamos apenas polinômios com coeficientes inteiros.

Polinômios podem ser multiplicados. Por exemplo, (x+3)(2x^2-2x+3)é igual 2x^3+4x^2-3x+9. Assim, 2x^3+4x^2-3x+9pode ser considerado x+3e 2x^2-2x+3, portanto, é composto.

Outros polinômios não podem ser fatorados. Por exemplo, 2x^2-2x+3não é o produto de dois polinômios (ignorando polinômios constantes ou com coeficientes não inteiros). Por isso, é primo (também conhecido como irredutível).

Regras

  • A entrada e a saída podem ser feitas de qualquer maneira padrão.
  • A entrada pode ser uma sequência 2x^2-2x+3, uma lista de coeficientes {2,-2,3}, ou qualquer outro meio semelhante.
  • A saída é um valor verdadeiro, se for primo, ou um valor falsey, se for composto. Você deve produzir o mesmo valor de verdade para todos os números primos e o mesmo valor de falsey para todos os polinômios compostos.
  • A entrada será de no mínimo 1 e no máximo 10.
  • Você não pode usar ferramentas internas para fatoração (de números inteiros ou expressões) ou solução de equações.

Exemplos

Verdadeiro - principal

x+3
-2x
x^2+x+1
x^3-3x-1
-2x^6-3x^4+2
3x^9-8x^8-3x^7+2x^3-10

Falso - composto

x^2
x^2+2x+1
x^4+2x^3+3x^2+2x+1
-3x^7+5x^6-2x
x^9-8x^8+7x^7+19x^6-10x^5-35x^4-14x^3+36x^2+16x-12

11
De uma pesquisa rápida no Google, esse é um problema difícil, independentemente do golfe.
Ou orp

5
Estou correto ao pensar que, por prime, você quer dizer irredutível ? Nesse caso, essa é basicamente uma variante dessa questão sobre polinômios de fatoração , e suspeito que ela não atraia respostas que não sejam fatoriais.
Peter Taylor

11
De acordo com este artigo recente , " Estamos interessados ​​na questão de decidir se um determinado polinômio é irredutível ou não. Consequentemente, é desejável um teste ou critério simples que daria essa informação. Infelizmente, esse critério não se aplicará a todos os critérios." classes de polinômios ainda não foram criadas ".
Peter Taylor

2
@AlexA., Existem muitos testes "se" que funcionam para alguns polinômios, mas a pergunta está pedindo um teste "se e somente se" que funcione para todos os polinômios.
Peter Taylor

11
Este é um bom problema! Observe que geralmente os polinômios são apenas primos em relação a um anel base (ou campo). Em particular, se o campo for um número complexo, nenhum polinômio de grau maior que 2 será primo. Então, eu especificaria se você deseja Rational (provavelmente o mais direto) Inteiro (isso também envolverá fatoração de número inteiro) ou módulo algum número m. Se m é primo, existem algoritmos bastante fáceis. Caso contrário, as coisas são um pouco mais complicado ... (mas possível)
Cody

Respostas:


3

Mathematica, 224 bytes

f@p_:=(e=p~Exponent~x;r=Range[⌈e/-4⌉,(e+2)/4];e<2||FreeQ[PolynomialRemainder[p,Thread@{r,#}~InterpolatingPolynomial~x,x]&/@Tuples[#~Join~-#&[Join@@Position[#/Range@Abs@#,_Integer]]&/@#]~DeleteCases~{(a_)..},0|{}]&[p/.x->r])

Explicação :

O método de Kronecker é usado aqui. Esse método gera certos polinômios de menor grau e testa se existe um fator do polinômio original.

Casos de teste :

f/@{x+3, -2x, x^2+x+1, x^3-3x-1, -2x^6-3x^4+2, 3x^9-8x^8-3x^7+2x^3-10}
(* {True, True, True, True, True, True} *)

f/@{x^2, x^2+2x+1, x^4+2x^3+3x^2+2x+1, -3x^7+5x^6-2x, x^9-8x^8+7x^7+19x^6-10x^5-35x^4-14x^3+36x^2+16x-12}
(* {True, True, True, True, True} *)

Leva 14s no meu laptop para concluir que 3x^9-8x^8-3x^7+2x^3-10é o melhor.


1

PARI / GP, 16 bytes, barato como o inferno

Por alguma razão, isso não foi permitido (observando que o comando não fatora ou resolve a equação):

polisirreducible

Caso de teste

%(x^2+x+1)

retorna 1(verdadeiro). Os outros exemplos funcionam da mesma forma.

Mas para mostrar que isso é solucionável da maneira mais difícil, aqui está uma solução completa.

Menos barato, mas sloooooooooow

Realmente não faz sentido jogar isso.

Beauzamy(P)=
{
  my(d=poldegree(P),s,c);
  s=sum(i=0,d,polcoeff(P,i)^2/binomial(d,i));
  c = 3^(3/2 + d);
  c *= s / (4*d*Pi);
  abs(c * pollead(P))
}
factorpol(P)=
{
  my(B=Beauzamy(P)\1, t=B*2+1, d=poldegree(P)\2, Q);
  for(i=0,t^(d+1)-1,
    Q=Pol(apply(n->n-B, digits(i,t)));
    if(Q && poldegree(Q) && P%Q==0, return(Q))
  );
  0
}
irr(P)=
{
  factorpol(P)==0
}

Edit: Os comentaristas apontaram que o primeiro método pode ser desaprovado pelo bom gosto, o espírito das regras, a Convenção de Genebra, as regras padrão das brechas, etc. Não concordo, mas, de qualquer forma, postei a segunda versão juntamente com o primeiro e certamente parece aceitável.


11
Hmmmm ... Tenho certeza de que este comando faz fator e / ou resolve equações sob o capô. (Além disso, se um desafio não permite determinados built-ins é meio implícito que um built-in que apenas resolve o problema também não é no espírito do desafio.)
Martin Ender

@ MartinBüttner: Eu acho que a primeira resposta se encaixa na letra, mas não no espírito, das regras do desafio. Por isso escrevi a segunda versão, que é uma solução legítima. Ele pode verificar se x^4+1(o que é famoso por qualquer redutível mod qualquer primo) é irredutível em 86 milissegundos. Se nada mais os outros podem adaptar e jogar golfe nesta versão.
Charles

11
A primeira resposta está em uma brecha que é banida por padrão: Usando funções internas para fazer o trabalho . Remova-o da sua resposta ou, pelo menos, indique que não é uma solução válida.
Isaacg

5
@isaacg No momento, essa não é uma brecha padrão válida (devido à discriminação dos votos + 44 / -29). Charles, se você concorda que apenas a segunda resposta é realmente legítima, inclua a contagem de bytes.
Martin Ender

@ MartinBüttner: Eu não - acho que ambos são legítimos pelas regras desta pergunta e pelo tópico das brechas gerais. Mas eu adicionei um comentário para apontar a questão.
Charles
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.