我正在尝试编写一种方法来生成高斯整数的高斯除数序列 - 高斯整数是正常整数或复数g = a + bi
其中a
和{{1两个都是整数,高斯整数b
的高斯除数是高斯整数g
,d
也是高斯整数。
我有以下代码。
g / d
似乎“大部分”都有效,但对于某些输入,它缺少一些高斯除数,例如:对于def is_gaussian_integer(c):
"""
Checks whether a given real or complex number is a Gaussian integer,
i.e. a complex number g = a + bi such that a and b are integers.
"""
if type(c) == int:
return True
return c.real.is_integer() and c.imag.is_integer()
def gaussian_divisors(g):
"""
Generates a sequence of Gaussian divisors of a rational or Gaussian
integer g, i.e. a Gaussian integer d such that g / d is also a Gaussian integer.
"""
if not is_gaussian_integer(g):
return
if g == 1:
yield complex(g, 0)
return
g = complex(g) if type(g) == int or type(g) == float else g
a = b = 1
ubound = int(math.sqrt(abs(g)))
for a in range(-ubound, ubound + 1):
for b in range(-ubound, ubound + 1):
if a or b:
d = complex(a, b)
if is_gaussian_integer(g / d):
yield d
yield g
,我希望序列包含除数2
(只是-2 + 0j
),但它缺失了。我无法弄清楚为什么会这样做或逻辑中存在差距。
-2
答案 0 :(得分:1)
而不仅仅是屈服
yield g
你还可以
yield -g
因为您的循环在int(math.sqrt(abs(g)))
= int(sqrt(2))
开始和停止,只有1
所以它只会测试-1
,0
和{{1} }。
另外,如果您想在循环中加入1
和-2
,则需要增加2
或ubound
math.ceil
结果。