【问题标题】:Pollard rho integer factorizationPollard rho 整数因式分解
【发布时间】:2010-02-21 11:09:48
【问题描述】:

我正在尝试在 C/C++ 中实现 Pollard Rho 整数分解。Google 为我提供了问题 here 的 Java 实现。

我不太了解 Java,所以我想出了this。我在 C++ 中的实现适用于大多数情况,但在少数情况下,我使用的不是“9999”。

我知道 C++ 没有 Biginteger 类,所以我无法拥有它在 JAVA 中提供的全部功能,但我想分解 15 位数字,足以满足 unsigned long long

请指出我的实现有什么问题。

【问题讨论】:

  • 您是否有机会将您的 C 代码粘贴到问题中,以便后人使用? (或者这不合适吗?我是 SO 的新手;也许 60 行的粘贴不受欢迎。)
  • C++ 也有大整数实现。最受欢迎的可能是 GNU 的一个:gmplib.org

标签: java c++ c math factorization


【解决方案1】:

问题就在这里:

#define abs(x) (x>0)?(x):(-x)

您的 abs 宏中缺少一些括号。试试:

#define abs(x) ((x)>0 ? (x) : -(x))

相反。 (考虑在x-xx <= 0 的情况下扩展abs(x-xx) 会发生什么。)

另外,为什么你的 gcd 函数返回一个 int 而不是 BigInteger?

您还应该知道(假设 unsigned long long 是 64 位整数类型)对于大于 2**32N,此代码将无法正常工作:如果 x(或 xx)是大于或等于2**32 然后x*x 将模2**64 包装,从而为x*x % N 提供错误的值。

【讨论】:

  • 这就是为什么内联函数尽可能优于宏。
  • 要明确一点,真正重要的不是缺少的括号,而是减号旁边的 misplaced 括号。为了安全地执行乘法,查找 SqrMod 和 MultiplyMod。
【解决方案2】:

我发现了一个区别:Java 代码将cx 分配为new BigInteger(N.bitLength(), random),而C++ 代码使用rand() % N,这是一个较小的随机范围。对于值 9999,二进制是 10011100001111,因此 Java 代码将给出 cx 的最大值 16383。

【讨论】:

  • 当 N 大于 32767 时,rand() 的较小范围可能会影响性能,但是您对 N=9999 时发生的情况的解释对我来说没有任何意义。
  • 我打错了一个错字:9999 十进制是 10011100001111,需要 14 位来表示。如果 N=9999,BigInteger(N.bitLength(), random) 将产生一个从 0 到 2^14-1 的整数,而 rand() % N 将产生一个从 0 到 9998 的整数。这不是代码中的关键错误,但也不是准确的翻译Java 版本的。
猜你喜欢
  • 2011-11-24
  • 1970-01-01
  • 1970-01-01
  • 2016-02-01
  • 2014-11-12
  • 1970-01-01
  • 2014-09-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多