素多项式


21

给定一个多项式,确定它是否为质数。

多项式是ax^n + bx^(n-1) + ... + dx^3 + ex^2 + fx + g,其中每个项是一个常数(系数)乘以一个非负整数幂x。具有非零系数的最高功率称为度。对于此挑战,我们仅考虑至少为1的多项式。即,每个多项式都包含x。另外,我们仅使用具有整数系数的多项式。

多项式可以相乘。例如,(x+3)(2x^2-2x+3)等于2x^3+4x^2-3x+9。因此,2x^3+4x^2-3x+9可以将x+3和分解为2x^2-2x+3,因此它是复合的。

其他多项式无法分解。例如,2x^2-2x+3不是任何两个多项式的乘积(忽略常数多项式或具有非整数系数的多项式)。因此,它是素数(也称为不可约)。

规则

  • 输入和输出可以通过任何标准方式进行。
  • 输入可以是类似的字符串,类似2x^2-2x+3的系数列表{2,-2,3}或任何类似的方式。
  • 如果输出为素数,则输出为真值,如果为复合值,则输出为假值。您必须为所有质数产生相同的真实值,并为所有复合多项式产生相同的假值。
  • 输入至少为1级,最大为10级。
  • 您可能不使用内置工具进行(整数或表达式的)分解或方程式求解。

例子

真实-质数

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

错误-复合

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
无论高尔夫运动如何,从快速谷歌搜索到这都是一个难题。
orlp

5
我在思考纠正的首要你的意思是束缚?如果是这样,那么这基本上是关于分解多项式的问题的变体,我怀疑它不会吸引任何不分解的答案。
彼得·泰勒

1
根据最近的这篇论文,“ 我们对确定一个给定的多项式是否不可约的问题感兴趣。因此,需要一个能够给出此信息的简单检验或准则。不幸的是,没有一种准则可以适用于所有多项式的类别尚未设计出来
彼得·泰勒

2
@AlexA,有很多很多的“如果”测试,其工作的一些多项式,但问题是要求一个“当且仅当”测试,适用于所有多项式。
Peter Taylor

1
这是一个很好的问题!注意,通常多项式相对于基环(或场)仅是质数。特别是,如果该字段是复数,则没有一个大于2的次数的多项式为质数。因此,我将指定您是否要使用Rational(可能是最简单的)Integer(这也将涉及一些整数分解)或对某些数字m取模。如果m为质数,则有相当简单的算法。否则情况会更棘手...(但可行)
科迪

Answers:


3

Mathematica,224个字节

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])

说明

这里使用克罗内克方法。该方法生成某些低阶多项式并测试是否存在原始多项式的因数。

测试用例

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} *)

我的笔记本电脑需要14秒才能得出结论3x^9-8x^8-3x^7+2x^3-10


1

PARI / GP,16字节,便宜得要命

出于某种原因,这是不允许的(请注意,该命令不考虑因数或方程式求解):

polisirreducible

测试用例

%(x^2+x+1)

返回1(true)。其他示例工作类似。

但是为了证明这是很难解决的,这里有一个完整的解决方案。

便宜些,但价格便宜

打高尔夫球真的没有意义。

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
}

编辑:评论员指出,良好的品味,规则的精神,日内瓦公约,标准漏洞规则等可能不允许使用第一种方法。首先,当然似乎可以接受。


1
嗯...我很确定这个命令可以在后台进行分解和/或求解方程式。(此外,如果挑战不允许某些内置组件,则暗示只解决问题的内置组件也不符合挑战的精神。)
Martin Ender 2015年

@MartinBüttner:我认为第一个答案符合挑战规则的文字,但不符合要求的精神。因此,我编写了第二个版本,这是一个合法的解决方案。它可以检查x^4+1(在任何素数中都是著名的可归约模)在86毫秒内不可归约。如果没有其他人可以适应和打这个版本。
查尔斯

1
第一个答案落在默认情况下被禁止的漏洞中:使用内置函数来完成工作。请从您的答案中删除它,或者至少表明它不是有效的解决方案。
isaacg 2015年

5
@isaacg当前这不是有效的标准漏洞(由于投票细分为+ 44 / -29)。查尔斯,如果您同意只有第二个答案才是真正合法的,则应包括其第二个字节数。
Martin Ender

@MartinBüttner:我不认为,按照这个问题的规则和一般的漏洞来看,这两者都是合法的。但我添加了评论以指出问题。
查尔斯(Charles)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.