如何确定具有s边的多边形的数字是否为多边形

时间:2017-08-21 03:39:23

标签: algorithm language-agnostic number-theory

多边形数被定义为表示为以正多边形的形状排列的点的数字。

例如:

三角数字是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的。

1 个答案:

答案 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。