組み込みの因数分解/多項式関数を使用せずに、整数または有限体上の既約に完全に多項式を因数分解します。
入力
プログラム/関数はn
入力として素数(またはゼロ)を受け取ります。フィールド/リングは、その次数の有限フィールド(つまりZ/nZ
)、またはのZ
場合にのみn
です0
。そうn
でない0
場合、または素数の場合、プログラムは失敗する可能性があります。多項式はになりますF[x]
。
プログラム/関数も入力として多項式を受け取ります。
入力にはある程度の柔軟性があります。入力を受け取る方法を必ず指定してください。たとえば、多項式は係数のリストとして、またはほとんどの人が期待する形式(例:)50x^3 + x^2
、またはその他の合理的な形式で入力できます。または、フィールド/リングの入力形式も異なる場合があります。
出力
プログラム/関数は、完全に因数分解された多項式を出力します。複数のルートを展開したままにすることができます(つまり、の(x + 1)(x + 1)
代わりに(x + 1)^2
)。バイナリ演算子間の空白を削除できます。並置をに置き換えることができ*
ます。奇妙な場所に空白を挿入できます。ファクターを任意の順序に並べ替えることができます。x
用語だけかもしれません(x)
。x
と書くことができますx^1
。ただし、定数項にはが含まれない場合がありますx^0
。無関係な+
兆候は許可されます。あなたは0
前にある用語を持っていないかもしれません、彼らは省かれなければなりません。各因子の先頭項がなければならない正で、負の符号は、外部でなければなりません。
テストケースでは、プログラムはこれらのそれぞれに対して妥当な時間(たとえば、2時間以内)で出力を生成できる必要があります。
入力: 2, x^3 + x^2 + x + 1
出力: (x + 1)^3
入力: 0, x^3 + x^2 + x + 1
出力: (x + 1)(x^2 + 1)
入力: 0, 6x^4 – 11x^3 + 8x^2 – 33x – 30
出力: (3x + 2)(2x - 5)(x^2 + 3)
入力: 5, x^4 + 4x^3 + 4x^2 + x
出力: x(x + 4)(x + 4)(x + 1)
入力: 0, x^5 + 5x^3 + x^2 + 4x + 1
出力: (x^3 + 4x + 1)(x^2 + 1)
テストケースを批判してくれたPeter Taylorに感謝します。
p
は要素{0, 1, ... , p-1}
があり、加算/乗算modの下にありp
ます。基本的に、mod p
で係数を減らしてください。また、ルート、つまり線形係数がある場合、多項式にプラグインされる{0, ... , p-1}
と、そのうちの1つが0
(mod p
)を生成することに注意してください。
Z
はZ/pZ
、適切なp
ヘンゼルリフトに因数分解することです。ただし、おそらくゴルフのアプローチは、(これは確かに私が見ているルートです)因子の高さの単純な境界を使用して、それをブルートフォースします。