多边形数被定义为表示为以正多边形的形状排列的点的数字。
例如:
三角数字是0,1,3,6,10,15,21,28,36,45,......
方数为0,1,4,9,16,25,36,49,64,81,100,......
五角形数字是0,1,5,12,22,35,51,70,92,117,...
依旧......
有众所周知的公式来计算这些数字中的任何一个。要计算第n个s-gonal数,可以使用公式(n ^ 2 *(s - 2) - (n *(s - 4)))/ 2
我想知道的是,是否有一种有效的方法可以检查给定数字的给定数字是否为s-gonal?
显而易见的方法是从生成s-gonal数的函数中取连续值,直到找到n,或者值超过n,但这具有线性时间复杂度。
我知道有一些公式可以用来确定一个数字是否是s的特定值的s-gonal,但我想要一个适用于任何s的。
答案 0 :(得分:2)
基于Wikipedia's article on Polygonal numbers我可以使用以下谓词来解决我在OP提出的问题中遇到的问题:
def isPolygonal(s, x):
''' Check if x is a s-gonal number '''
assert s > 2 and s % 1 == 0 and x % 1 == 0
# Determine if x is some nth s-gonal number,
# fail if n doesn't come out a whole number
n = (sqrt(8 * (s - 2) * x + (s - 4) ** 2) + (s - 4)) / (2 * (s - 2))
return n % 1 == 0
这个并不坚持int
论证,只是说它们是整数,即5.0就我们的目的而言就好于5。