使用SymPy在高斯整数中找到最大公约数(GCD)

时间:2018-10-07 19:26:08

标签: python sympy greatest-common-divisor

我尝试使用Sympy查找两个高斯整数的GCD,但无法获得正确的结果。例如,函数

gcd(2+I,5, gaussian = True)

应返回2+I(我是虚数单位),因为(2+I)*(2-I)=5以高斯整数表示。但是,它返回1

1 个答案:

答案 0 :(得分:0)

看起来gcd不足以意识到高斯整数(即错误)。但是,您可以基于欧几里得算法使用自己的函数。

from sympy import sympify, I, expand_mul
def my_gcd(a, b):
    a, b = map(sympify, (a, b))
    if abs(a) < abs(b):
        a, b = b, a
    cr, ci = (a/b).as_real_imag()
    if cr.is_integer and ci.is_integer:
        return -b if b.could_extract_minus_sign() else b
    c = int(round(cr)) + I*int(round(ci))
    return my_gcd(a - expand_mul(b*c), b)

测试:

my_gcd(30, 18)   #  6
my_gcd(5, 2+I)   #  2+I
my_gcd(30, 18+4*I)   # 4 + 2*I

检查以下各项的最后一项:30 = (4+2*I)*(6-3*I)18+4*I = (4+2*I)*(4-I)