web-dev-qa-db-ja.com

ガウス整数を因数分解するための優れた方法は何ですか?

私はすでに素因数分解(整数用)を持っていますが、ガウス整数用に実装したいのですが、どうすればよいですか?ありがとう!

32
muaddib

完全な単一セル整数の精度が必要な場合は、実数成分と虚数成分に浮動小数点を使用し、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

安全のため、整数に浮動小数点を使用する場合は、すべての計算で丸められた値を使用してください。

0
Lehs