我正在开发一个程序来分解大的半素数。我正在使用简单的二次筛技术。我的程序运行良好,但速度慢得多,因为在筛分过程中(当我寻找B-平滑数时),我使用了除法过程(Java“ BigInteger”类的除法)。我听说使用对数而不是除法可以使其更快。现在我知道了对数的工作原理,但是我不知道如何适应对数运算符而不是除法,因为在筛分过程中,我需要将数字除以找到所有主要因素。
这里是一个例子:
N = 15347,要分解的数字。 rootN = Ceil(sqrt(N))= 124,因数为{2,17,23,29}
Q(x)=(124 + x)^ 2-N
现在,对于某些x,我们需要找到完全基于因子基数的Q(x):
Q(0)=(124 + 0)^ 2-N = 29 = 2 ^ 0 + 17 ^ 0 + 23 ^ 0 + 29 ^ 1:B平滑数
Q(1)=(124 + 1)^ 2-N = 278 =未完全分解为因子基。
Q(2)=(124 + 2)^ 2-N = 529 = 2 ^ 0 + 17 ^ 0 + 23 ^ 2 + 29 ^ 0:B平滑数
Q(3)=(124 + 3)^ 2-N = 782 = 2 ^ 1 + 17 ^ 1 + 23 ^ 1 + 29 ^ 0:B光滑数
以此类推,
因此,要确定B平滑数,我们需要尝试将Q(x)除以因子库的所有素数以及它们的最大可能指数。我还使用了Tonelli–Shanks算法来加快查找B平滑数的速度。我仍然需要进行模和除法过程来确定Q(x)是否为B平滑。
现在我不明白如何使用对数来避免除法,该除法可以帮助快速找到B平滑数。
谢谢。
答案 0 :(得分:1)
您的因数素数2、17、23和29的对数分别为0.7、2.8、3.1和3.4。四个Q中的因数素数素数之和为Q(0)= 3.4,Q(1)= 0.7,Q(2)= 6.2和Q(3)= 6.6。如果您设置了一个限制,即所有对数大于3的Q都“可能是平滑的”,那么您将通过试算除以因子基来分解Q(0),Q(2)和Q(3)并确认这三个都确实是平滑的(请注意,即使您表示并非如此,529 = 23 * 23在您的因子基础上也是平滑的。)