数论方面算法问题,如何快速判断n!+1为完全平方数的n

2个回答

  • 你先要讲清楚你所说的区间大致是从几到几的区间,这直接影响到什么样子的算法是可以接受的.不要很笼统地说区间越大越好,算法越快越好.

    在n比较小的时候当然是枚举最方便,即使是需要考虑大数运算的复杂程度.

    当n比较大之后n!的末尾是连续的k个0,k可以通过1:n中5的因子出现次数来得到,这样如果n!+1是平方数的话,其平方根必定是p*10^k+1或者p*10^k-1的形式,这样相当于验证n!=A(A+2),可以先用实数运算算出ln(n!)=ln((n-1)!)+ln(n)(这步的舍入误差其实是很小的),仅当估计得到的A或者A+2非常接近p*10^k的形式时才进一步验证.

    当n大到一定程度的时候,A^2>>2A,只需要验证ln(n!)=2ln(A),当A非常接近p*10^k时才进一步验证.

    再说一下所谓的“进一步验证”,首先是利用浮点舍入误差分析计算出误差界来估计所谓的“非常接近”,然后对A和A+2进行质因子分解(也要用大数计算).