私はすでに素因数分解(整数用)を持っていますが、ガウス整数用に実装したいのですが、どうすればよいですか?ありがとう!
完全な単一セル整数の精度が必要な場合は、実数成分と虚数成分に浮動小数点を使用し、gsub、gmul、および床ではなく丸められた係数を持つ特別な除算gdivrを定義します。これは、ポラードロー因数分解法がユークリッドのアルゴリズムを介してgcdを必要とするためですが、gmoduloはわずかに変更されています。
gmodulo((x,y),(x',y'))=gsub((x,y),gmul((x',y'),gdivr((x,y),(x',y'))))
ポラードロー
def poly((a,b),(x,y))=gmodulo(gsub(gmul((a,b),(a,b)),(1,0)),(x,y))
input (x,y),(a,b) % (x,y) is the Gaussian number to be factorized
(c,d)<-(a,b)
do
(a,b)=poly((a,b),(x,y))
(c,d)=poly(poly((c,d),(x,y)),(x,y))
(e,f)=ggcd((x,y),gsub((a,b),(c,d)))
if (e,f)=(x,y) then return (x,y) % failure, try other (a,b)
until e^2+f^2>1
return (e,f)
通常の開始値はa = 1、b = 0です。
私は自分のブログでForthでプログラムされたこの方法を使用しました http://forthmath.blogspot.se
安全のため、整数に浮動小数点を使用する場合は、すべての計算で丸められた値を使用してください。