识别不合理或复杂的数字

时间:2017-02-17 16:12:06

标签: python python-3.x complex-numbers

我正在取一个数字的平方根,我想找出它是不合理的还是复杂的,并返回真或假

测试用例,其中,对于无理/复数,取数字的平方根为True;如果平方根为Falsefloat,则为int。 / p>

[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

如何制作实现此功能的功能?

2 个答案:

答案 0 :(得分:1)

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

def has_complex_sqrt(num):
    return num < 0

然而,要找出一个数字是否具有不合理的平方根,则更难。如果您的号码是字符串,那么的工作方式,因为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())

最后把这一切都放到一个&#34;超级功能&#34;:

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

为方便起见,检查两者中是否有任何一项的另一个函数是True

def has_irrational_or_complex_sqrt(num):
    return has_complex_sqrt(float(num)) or has_irrational_sqrt(num)

现在进行互动测试:

>>> 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

产生预期值。乌拉!

如果您的输入已经是float,则可能 无法正常工作!

>>> has_irrational_or_complex_sqrt('0.01')
False
>>> has_irrational_or_complex_sqrt(0.01)  # Oups!
True

但是在你的例子中它起作用是因为6.25可以完全表示为float:

>>> has_irrational_or_complex_sqrt(6.25)
False

答案 1 :(得分:-1)

基于@MSeifert的答案,但写得更简单:

import collections, fractions
def get_prime_factors(n):
    #http://stackoverflow.com/a/22808285/5393381
    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  
def has_irrational_square_root(num):
    #http://stackoverflow.com/questions/42302488/identify-a-irrational-or-complex-number
    frac = fractions.Fraction(str(num))
    top_primes = get_prime_factors(frac.numerator)
    bottom_primes = get_prime_factors(frac.denominator)
    all_even_top = all(num % 2 == 0 for num in collections.Counter(top_primes).values())
    all_even_bottom = all(num % 2 == 0 for num in collections.Counter(bottom_primes).values())
    if all_even_top and all_even_bottom:
        return False
    return True