素多項式


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+32x^2-2x+3、それは複合体であるので、。

他の多項式は因数分解できません。たとえば、2x^2-2x+3は2つの多項式の積ではありません(定数多項式または非整数係数を持つ多項式は無視されます)。したがって、それは素数(既約とも呼ばれます)です。

ルール

  • 入力と出力は、標準的な方法で行うことができます。
  • 入力は、などの文字列、など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

False-複合

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。、いくつかの多項式で機能する多くの「if」テストがありますが、問題はすべての多項式で機能する「if and only if」テストを要求することです。
ピーターテイラー

1
これはいい問題です!通常、多項式はベースリング(またはフィールド)に対して素であることに注意してください。特に、フィールドが複素数の場合、2を超える次数の多項式は素数になりません。したがって、Rational(おそらく最も単純な)整数(これには整数の因数分解も含まれます)を必要とするか、または数mを法とするかを指定します。mが素数の場合、かなり簡単なアルゴリズムがあります。そうでなければ、物事はもう少しトリッキーです...(しかし実行可能)
コーディ

回答:


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

私のラップトップでは、それ3x^9-8x^8-3x^7+2x^3-10が最高だと結論付けるのに14秒かかります。


1

PARI / GP、16バイト、安い

何らかの理由でこれは許可されませんでした(コマンドが因数分解または方程式解決を行わないことに注意してください):

polisirreducible

テストケース

%(x^2+x+1)

1(true)を返します。他の例も同様に機能します。

しかし、これが難しい方法で解決できることを示すために、ここに完全なソリューションがあります。

安くはないが、sloooooooooow

これをゴルフするのは本当に意味がありません。

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
うーん...私はこのコマンド内部で方程式を因数分解および/または解くと確信してます。(また、チャレンジが特定のビルトインを許可しない場合、問題を解決するビルトインもチャレンジの精神ではないことを暗示しています。)
マーティン・エンダー

@MartinBüttner:最初の答えは、チャレンジのルールの精神ではなく、手紙に合っていると思います。それが正当な解決策である2番目のバージョンを書いた理由です。これは、ことを確認することができますx^4+1(これは、任意のプライム有名な還元性のMODである)は86ミリ秒単位で既約です。他の人がこのバージョンを適応してゴルフすることができない場合。
チャールズ

1
最初の答えは、デフォルトで禁止されている抜け穴に該当します。組み込み関数を使用して作業を行います。回答から削除するか、少なくとも有効なソリューションではないことを示してください。
isaacg

5
@isaacg現在、これは有効な標準の抜け穴ではありません(投票の内訳+ 44 / -29のため)。チャールズ、2番目の答えだけが本当に正当であることに同意する場合、代わりにそのバイト数を含めるべきです。
マーティンエンダー

@MartinBüttner:私はそうではありません-私は両方とも、この質問のルールと一般的な抜け穴スレッドによって合法だと思います。しかし、問題を指摘するコメントを追加しました。
チャールズ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.