Java 如何在二次筛选技术的筛选步骤中使用对数
我正在做一个程序来计算大的半素数。我使用的是简单的二次筛技术。我的程序运行得很好,但速度要慢得多,因为在筛选过程中(当我寻找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-平滑数。我仍然需要mod和division过程来确定Q(x)是否是B-平滑的 现在我不明白如何使用对数来避免除法,这有助于快速找到B-平滑数Java 如何在二次筛选技术的筛选步骤中使用对数,java,cryptography,rsa,logarithm,Java,Cryptography,Rsa,Logarithm,我正在做一个程序来计算大的半素数。我使用的是简单的二次筛技术。我的程序运行得很好,但速度要慢得多,因为在筛选过程中(当我寻找B-平滑数时),我使用了除法过程(Java“BigInteger”类的除法)。我听说用对数代替除法可以使它快得多。现在我知道对数是如何工作的,但我不明白如何拟合对数运算符而不是除法,因为在筛选过程中,我需要对数字进行除法,以找到所有的素因子 以下是一个例子: N=15347,需要计算的数字。 rootN=Ceil(sqrt(N))=124,因子基数{2,17,23,29}
谢谢。因子基素数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在因子基础上是平滑的,即使您声明不是如此)。非常感谢您,我根据你的陈述修改了我的问题。我不明白这句话“四个Q中的因子基素数之和是Q(0)=3.4,Q(1)=0.7,Q(2)=6.2和Q(3)=6.6。”当你使用对数时,你不应该有这些信息,除了找到Q(x),不知何故,他们使用了一些素数的对数值相加,并得到反对数来得到Q(x).筛子将对数相加。完成筛选后,扫描超过阈值的日志和。不需要反日志。如果这对您有帮助的话,我有Python代码。谢谢。请你用一个小例子来解释,或者你可以用你的程序生成一个例子来帮助理解这些步骤。平滑数是所有素数(从因子基)的组合,其指数从零开始到某个整数。我不需要任何代码。谢谢你,看。在博客的第二页有一个完整的例子。哦,那是你的博客!我在这里提交问题之前读过这篇文章。它不包含我正在寻找的信息。无论如何,谢谢你的回复。