Python - 是五角形数字检查

时间:2016-05-23 11:50:11

标签: python math sequence

我正在尝试写一张支票,以确定数字是否为五角形。五边形数字是由公式生成的数字:







PN = N(3N-1)/ 2







即。第一个五边形数字是:







1,5,12,22,35,51,70,92,117,145,......







我的当答案应 True 时,代码会抛出 False ,所以这显然不正确,但我很难理解为什么。它如下:




 来自math import sqrt
 def is_pent(n):
 ans = any((x *((3 * x)-1))/ 2 == n for x in range(int(sqrt(n))))
返回
  




我会感谢你的帮助!




3 个答案:

答案 0 :(得分:7)

根据Wikipedia,要测试正整数x是否为五角数,您可以检查((sqrt(24*x) + 1) + 1)//6是否为自然数。像这样的东西应该适用于不是很大的整数:

from math import sqrt 

def is_pentagonal(n):
    k = (sqrt(24*n+1)+1)/6
    return k.is_integer()

答案 1 :(得分:2)

你的代码不起作用的原因是你是否正在减少测试过多的整数范围。有意义的是减少它(使用sqrt),但它会导致你错过一些值。

相反,您可以增加测试范围:

#!/usr/bin/env python3

from math import sqrt

def is_pent(n):
    ans = any((x*((3*x)-1))/2 == n for x in range(int((n+1))))
    return ans

for i in range(500):
    if is_pent(i):
        print(str(i) + " is pentagonal")

测试输出:

$ ./test_script3.py
0 is pentagonal
1 is pentagonal
5 is pentagonal
12 is pentagonal
22 is pentagonal
35 is pentagonal
51 is pentagonal
70 is pentagonal
92 is pentagonal
117 is pentagonal
145 is pentagonal
176 is pentagonal
210 is pentagonal
247 is pentagonal
287 is pentagonal
330 is pentagonal
376 is pentagonal
425 is pentagonal
477 is pentagonal

编辑:当然,你最好使用更短的代码,比如在eugene y answer中提出的

答案 2 :(得分:1)

您可以使用fsolve来获取使用您的号码动态生成的等式的根。例如

import numpy
from scipy.optimize import fsolve

def root(x,n):
    return ((3*x*x-x)/2)-n

n = 70 #number to check if pentagonal or not

function_root = fsolve(root,n/2,n)

if function_root == int(function_root):
    print "number is pentagonal number"