lol*_*lol -3 python complex-numbers python-3.x
我正在取一个数的平方根,我想找出它是无理数还是复数,并返回 True 或 False
测试用例,其中取数字的平方根True用于无理数/复数,False如果平方根是 afloat或int。
[IN 1] 20
[OUT 1] True
[IN 2] 25
[OUT 2] False
[IN 3] -1
[OUT 3] True
[IN 4] -20
[OUT 4] True
[IN 5] 6.25
[OUT 5] False
Run Code Online (Sandbox Code Playgroud)
我怎样才能实现这个功能?
检查一个数是否有复数平方根很容易,如果有负数就是这种情况:
def has_complex_sqrt(num):
return num < 0
Run Code Online (Sandbox Code Playgroud)
然而,很难找出一个数字是否有一个无理数的平方根。如果您的数字是字符串,则有一种方法可以工作,因为fractions.Fraction可以计算该数字的确切表示。
然后使用这样一个事实,即一个数字的平方根只能是有理数,如果表示该数字的分数的分子和分数的每个素因数都具有偶数指数。(网上有很多资源支持这个)
所以解决这个问题的步骤是:
在代码中实现:
from fractions import Fraction
def get_fraction_from_string(num):
return Fraction(num)
def get_prime_factors(n):
# Taken from http://stackoverflow.com/a/22808285/5393381
# you might implement another algorithm here!
i = 2
factors = []
while i * i <= n:
if n % i:
i += 1
else:
n //= i
factors.append(i)
if n > 1:
factors.append(n)
return factors
from collections import Counter
def has_even_exponents(primefactorized):
return all(num % 2 == 0 for num in Counter(primefactorized).values())
Run Code Online (Sandbox Code Playgroud)
最后将这一切整合到一个“超级功能”中:
def has_irrational_sqrt(astring):
fract = get_fraction_from_string(astring)
primefactors_numerator = get_prime_factors(fract.numerator)
if not has_even_exponents(primefactors_numerator):
return True
primefactors_denominator = get_prime_factors(fract.denominator)
if not has_even_exponents(primefactors_denominator):
return True
return False
Run Code Online (Sandbox Code Playgroud)
为方便起见,另一个检查两者中是否有任何一个的函数是True:
def has_irrational_or_complex_sqrt(num):
return has_complex_sqrt(float(num)) or has_irrational_sqrt(num)
Run Code Online (Sandbox Code Playgroud)
现在是交互式测试:
>>> has_irrational_or_complex_sqrt('20')
True
>>> has_irrational_or_complex_sqrt('25')
False
>>> has_irrational_or_complex_sqrt('-1')
True
>>> has_irrational_or_complex_sqrt('-20')
True
>>> has_irrational_or_complex_sqrt('6.25')
False
Run Code Online (Sandbox Code Playgroud)
这会产生预期值。欢呼!
如果您的输入已经是一个float这种方法可能行不通!
>>> has_irrational_or_complex_sqrt('0.01')
False
>>> has_irrational_or_complex_sqrt(0.01) # Oups!
True
Run Code Online (Sandbox Code Playgroud)
但是在您的示例中它有效,因为6.25可以完全表示为浮点数:
>>> has_irrational_or_complex_sqrt(6.25)
False
Run Code Online (Sandbox Code Playgroud)