识别无理数或复数

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)

我怎样才能实现这个功能?

MSe*_*ert 5

检查一个数是否有复数平方根很容易,如果有负数就是这种情况:

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)