【发布时间】:2014-05-19 15:45:54
【问题描述】:
我正在实现 p+1 分解算法。为此,我需要计算由以下定义的卢卡斯序列的元素:
(1) x_0 = 1, x_1 = a
(2) x_n+l = 2 * a * x_n - x_n-l
我递归地实现了它(C#),但它对于更大的索引效率低下。
static BigInteger Lucas(BigInteger a, BigInteger Q, BigInteger N)
{
if (Q == 0)
return 1;
if (Q == 1)
return a;
else
return (2 * a * Lucas(a, Q - 1, N) - Lucas(a, Q - 2, N)) % N;
}
我也知道
(3) x_2n = 2 * (x_n)^2 - 1
(4) x_2n+1 = 2 * x_n+1 * x_n - a
(5) x_k(n+1) = 2 * x_k * x_kn - x_k(n-1)
(3) 和 (4) 应该有助于计算更大的 Q。但我不确定如何。 不知何故,我认为 Q 的二进制形式。
感谢任何帮助。
【问题讨论】:
-
对于此类任务,您可以使用记忆功能来避免多次重新计算相同的子结果。此外,研究使用基于堆的堆栈来跟踪进度而不是递归 - 这可以防止 StackOverflowExceptions,还可以通过减少堆栈的流失来提高性能。
-
您正在计算这个 mod
N的事实可能很有用。N的值是否还有其他限制? -
N 是一个正的非质数。我认为解决方案在这里的第三段中:programmingpraxis.com/2010/06/04/… 但我很难理解它并将其放入代码中。
标签: c# performance algorithm