- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
下面是我对质因数分解的 Pollard rho 算法的实现:
#include
#include
#include
// Interface to the GMP random number functions.
gmp_randclass rng(gmp_randinit_default);
// Returns a divisor of N using Pollard's rho method.
mpz_class getDivisor(const mpz_class &N)
{
mpz_class c = rng.get_z_range(N);
mpz_class x = rng.get_z_range(N);
mpz_class y = x;
mpz_class d = 1;
mpz_class z;
while (d == 1) {
x = (x*x + c) % N;
y = (y*y + c) % N;
y = (y*y + c) % N;
z = x - y;
mpz_gcd(d.get_mpz_t(), z.get_mpz_t(), N.get_mpz_t());
}
return d;
}
// Adds the prime factors of N to the given vector.
void factor(const mpz_class &N, std::vector &factors)
{
std::queue to_factor;
to_factor.push(N);
while (!to_factor.empty()) {
mpz_class n = to_factor.front();
to_factor.pop();
if (n == 1) {
continue; // Trivial factor.
} else if (mpz_probab_prime_p(n.get_mpz_t(), 5)) {
// n is a prime.
factors.push_back(n);
} khác {
// n is a composite, so push its factors on the queue.
mpz_class d = getDivisor(n);
to_factor.push(d);
to_factor.push(n/d);
}
}
}
它本质上是 pseudocode on Wikipedia 的直接翻译,并依赖 GMP 进行大数和素性测试。该实现效果很好,可以分解质数,例如
1000036317378699858851366323 = 1000014599 * 1000003357 * 1000018361
但会窒息,例如
1000000000002322140000000048599822299 = 1000000000002301019 * 1000000000000021121
我的问题是:除了切换到更复杂的分解算法(例如 Quadratic sieve)之外,我能做些什么来改进这一点吗? ?
我知道一个改进可能是首先用预先计算的素数做一些试验除法,但这对像上面这样的几个大素数的乘积没有帮助。
我对任何有关改进基本 Pollard 的 rho 方法以使其处理仅包含几个素因子的较大复合 Material 的提示感兴趣。当然,如果您在上面的代码中发现任何愚蠢之处,我也很感兴趣。
完整披露:这是一项家庭作业,因此一般提示和指示比完全编码的解决方案更好。通过这种非常简单的方法,我已经在作业中取得及格分数,但我当然希望有所改进。
Cảm ơn trước.
câu trả lời hay nhất
由于 Pollard,您正在使用原始版本的 rho 算法。 Brent 的变体有两个改进:Floyd 的龟兔赛跑算法被 Brent 开发的赛跑赛跑算法所取代,并且 gcd 计算被延迟,因此它在循环中每百次左右只执行一次而不是每次。但是这些更改只会带来很小的改进,可能是 25% 左右,并且不会让您对所讨论的大数字进行因式分解。因此,您将需要一个更好的算法:SQUFOF 可能适用于您提到的大小的半素数,或者您可以实现二次筛法或椭圆曲线法。我在 my blog 讨论和实现了所有这些算法.
关于c++ - 我如何改进这个 Pollard 的 rho 算法来处理半大素数的乘积?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19741967/
因此,我尝试使用 BigInteger 类在 Java 中创建 Pollard 的 Rho 因子分解算法以支持非常大的整数。该代码大部分有效,但找不到 4 或 8(应该是 2)的因数。目前,我已将其限
我最近偶然发现了 a paper关于 Pollard's Rho algorithm 的并行化,考虑到我的具体应用,除了我没有达到所需的数学水平这一事实之外,我想知道这种特殊的并行化方法是否有助于我的
我实现了 wikipedia 上给出的 Pollard Rho 算法 x ← 2; y ← 2; d ← 1 while d = 1: x ← g(x) y ← g(g(y))
我正在尝试实现 Pollard 的 Rho 算法来查找整数 n 的因数。我有一个通常有效的实现,但现在遇到了一些问题。在这种情况下,我的 n = 262063。 这是我的 Rho 算法,以及引用的 g
我正在尝试根据我在维基百科上找到的伪代码来实现 Pollard Rho,但它似乎不适用于数字 4、8 和 25,而且我不知道为什么。 这是我的代码: long long x = initXY;
Pollard Rho factorization method uses a function generator f(x) = x^2-a(mod n) or f(x) = x^2+a(mod n
每次我使用 Pollard Rho 因式分解方法对一个数进行因式分解时,是否有必要在 Pollard Rho 因式分解之前检查其素数?如果是,那么每次我想对任何数字进行因式分解时,我都必须实现 Mil
我正在尝试在 C/C++ 中实现 Pollard Rho 整数分解。Google 为我提供了问题的 Java 实现 here . 我不太了解 Java,所以我想出了什么 this .我在 C++ 中的
我正在尝试在 Python 中实现 Pollard 的 P-1 分解。请注意,Rho 方法有一些答案,但这个 p-1 是不同的,关于 p-1,我能给你的最好的是 wiki 和 Wolfram: htt
#include #include typedef unsigned long long int ULL; ULL gcd(ULL a, ULL b) { for(; b >0 ;)
为了尝试解决 Euler 项目的第三个问题 (https://projecteuler.net/problem=3),我决定实现 Pollard 的 Rho 算法(至少是其中的一部分,我计划稍后包括循
我有以下功能。我从两个站点获得它并尝试将其改编成我自己的,但效果不佳。 当我测试 unsigned long int max - 2 或 to 但它作为一个数字 4294967293 时,它会将以下代
我正在用 C 语言编写来自 wiki 的 Pollard's rho 算法,即用于对数的 Pollard's rho 算法。但我有一个我不知道的运行时错误。我认为这可能是来自指针。你能发现错误吗? #
谁能帮我解决 pollard rho 的实现问题?我已经在 C 中实现了它。它可以很好地处理最多 10 位数字,但无法处理更大的数字。 请帮助我改进它以进行最多 18 位数字的因式分解。我的密码是 t
我正在尝试根据书中的描述实现 Pollard 的 rho 算法来计算离散对数 Prime Numbers: A Computational Perspective作者:Richard Crandall
我正在尝试实现 Pollard Rho Haskell 中的因式分解方法。这是我的目的 func :: Int -> Int -> Int func x n = mod ( x * x - 1) n
下面是我对质因数分解的 Pollard rho 算法的实现: #include #include #include // Interface to the GMP random number f
我不知道我在尝试使用 Pollard 的 rho 算法计算质因数分解时哪里做错了。 #include #define f(x) x*x-1 int pollard( int ); int gcd(
这是用于计算取自 CLRS 的整数因式分解的伪代码。但是计算Line 8中涉及的GCD有什么意义,当i == k时需要doubling k> 在第 13 行。?请帮忙。 最佳答案 尽管有标签,但该伪代
这段代码是用 C 语言根据 pollard 的对数 rho 算法(来自 wiki)编写的。在此代码中,如果我输入 alpha=2、beta=5、N=1019,则必须返回 a=681、b=378、A=3
Tôi là một lập trình viên xuất sắc, rất giỏi!