算法 – 什么是一个很好的方法来确定高斯整数?

我已经有素数分解(对于整数),但是现在我要实现高斯整数,但是该怎么做呢?谢谢!
原来是有点冗长,但我希望它完全回答你的问题…

Gaussian integer是一个复杂的形式

G = a bi

其中i2 = -1,a和b是整数。

高斯整数形成一个唯一的分解域。其中一些作为单位(例如1,-1,i和-i),一些作为素数(例如1 i),其余的复合物可以分解为唯一的素数和单位的乘积,另外从因素的顺序和一组产品为1的单位的存在。

这样一个数字G的范数被定义为一个整数:norm(G)= a2 b2。

可以看出,规范是乘法属性,即:

norm(I * J)= norm(I)* norm(J)

所以如果你想要考虑一个高斯整数G,你可以利用这样一个事实:任何分解G的高斯整数I都必须满足规范(I)划分规范(G)的属性,你知道如何找到范数(G)。

高斯整数的素数分为三类:

1 / – 我,规范2,

a / – bi,素数a2 b2等于1 mod 4,

a,其中a是3 mod 4的素数,与标准a2

现在把它变成一个算法…如果你想要一个高斯整数G,
您可以找到其规范N,然后将其归因于主要整数。然后
我们按照这个清单工作,剥离对应的N的主因素p
以我们的原始数字G为主的高斯因子q

只有三种情况需要考虑,其中两种是微不足道的。

如果p = 2,则令q =(1 i)。 (注意,q =(1-i)将同样好地工作,因为它们仅仅以单位因子而不同。)

如果p = 3 mod 4,则q = p。但是q的规范是p2,所以我们可以罢工
剩余因子(G)的列表中的另一个因素。

p = 1 mod 4是唯一一个有点棘手处理的情况。
这相当于将p表示为两个正方形的总和的问题:
如果p = a2 b2,则bi和a-bi形成高斯的共轭对
素数与标准p,其中一个将是我们要寻找的因素。

但是用一点数量的理论,结果不是太难了。
考虑整数mod p。假设我们可以找到一个整数k
那k2 = -1 mod p。那么k2 1 = 0 mod p,这相当于
说p在整数中除以k2 1(因此也是
高斯整数)。在高斯整数中,k2 1因素进入
(k i)(k-i)。 p分开产品,但也不分
因子。因此,p每个都有一个非常重要的GCD
因子(k i)和(k-i),并且GCD或其共轭是
我们正在寻找的因素!

但是我们如何找到这样一个整数?让n在之间有一个整数
2和p-1。计算n(p-1)/ 2 mod p – 该值将是
1或-1。如果-1,则k = n(p-1)/ 4,否则尝试不同的n。
n的几乎一半可能给我们一个平方根
-1 mod p,所以不需要很多猜测来找到k的值
作品。

要找到具有规范p的高斯素数,只需使用Euclid’s algorithm
(稍微修改为使用高斯整数)来计算GCD
(p,k i)。这给一个试验除数。如果它均匀分割
高斯整数我们试图考虑(余数= 0),我们完成了。
否则,其共轭是期望的因子。

欧几里德的高斯整数GCD算法几乎相同
对于正常的整数。每次迭代由一个试验部门组成
与余下。如果我们正在寻找gcd(a,b)

q = floor(a / b),余数= a – q * b,如果余数不为零
我们返回gcd(b,余数)。

在整数中,如果我们得到一个分数作为商,我们将其舍入为零。
在高斯整数中,如果商的实部或虚部是分数,则它们被舍入到最接近的整数。除此之外
算法是一样的。

因此,将因子分解为高斯整数G的算法看起来像
这个:

计算范数(G),然后计算因子范数(G)到素数p1,p2 … pn。

For each remaining factor p:
   if p=2, u = (1 + i).   
      strike p from the list of remaining primes.
   else if p mod 4 = 3, q = p, and strike 2 copies of p from the list of primes.
   else find k such that k^2 = -1 mod p, then u = gcd(p, k+i)
       if G/u has remainder 0, q = u
       else q = conjugate(u)
       strike p from the list of remaining primes.
   Add q to the list of Gaussian factors.
   Replace G with G/q.
endfor

在这个程序的最后,G是一个规范1的单位。但并不一定
1 – 它可以是-1,i或-i,在这种情况下,将G添加到因子列表中,
当你把所有的因素都乘以时,使符号变得正确
看产品是否匹配G的原始值

这是一个工作的例子:因子G = 361 – 1767i高斯整数。
norm(G)= 3252610 = 2 * 5 * 17 * 19 * 19 * 53

考虑到2,我们尝试q =(1 i),并找到G / q = -703 – 1064i,其余为0。

G≤G/ q = -703-1064i

考虑到5,我们看到它与1 mod 4是一致的。我们需要找到一个好的k。
尝试n = 2,n(p-1)/ 2 mod p = 22 mod p = 4. 4等于-1 mod 5.成功! k = 21 = 2. u = gcd(5,2 i),其为2 i。
G / u = -494 – 285i,其余为0,所以我们发现q = 2 i。

G≤G/ q = -494-285i

考虑到17,它也符合1 mod 4,所以我们需要找到另一个
k mod 17.尝试n = 2,28 = 1 mod 17,没问题。尝试n = 3而不是。
38 = 16 mod 17 = -1 mod 17.成功!所以k = 34 = 13 mod 17。
gcd(17,13 i)= u = 4-i,G / u = -99 -96i,其余为-2。不好,
所以尝试共轭(u)= 4 i。 G / u = -133 – 38i,余数为0.另一个因素!

G 我们从列表中打了19份的第二份副本。

G = G / 19 = -7-2i

考虑到53,它与1模4相同。再次与k进程
尝试n = 2,226 = 52 mod 53 = -1 mod 53.然后k = 213 mod 53 = 30。
gcd(53,30 i)= u = -7 – 2i。这与G相同,所以最后
商G /( – 7-2i)= 1,并且不存在-1,i或-i的因素
关于。

我们已经找到因素(1 i)(2 i)(4 i)(19 0i)( – 7-2i)。如果你倍增
那就出来了(作为读者的一个练习),lo,看哪,
产品是361-1767i,这是我们开始的数量。

数论不甜吗?

http://stackoverflow.com/questions/2269810/whats-a-nice-method-to-factor-gaussian-integers

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:算法 – 什么是一个很好的方法来确定高斯整数?