【问题标题】:Converting arbritrary size strings into arbritrary precision integers (bigints)将任意大小的字符串转换为任意精度的整数(bigints)
【发布时间】:2010-04-25 19:36:39
【问题描述】:

我正在尝试对任意大整数实施 Solovoy-Strassen 素数测试。我还将编写一个 bignum(不能使用 3rd 方实现,因为这是一个学术项目)。我已经决定了 bignum 的以下结构:

struct {
  uint64_t *tab;
  int size; // number of limbs
  int sign;
}

我将使用 base-32 作为我的数字(因此 uint64_t,对于部分产品,至少我假设它们将是部分产品)。这个决定是基于previous question asked.

我处于静止状态。我无法想象如何将一个字符串表示为任意大小的小数并将其转换为上面的 bignum 结构。

有人可以告诉我。即使是更小的例子也很好,比如将任意字符串转换为八进制数字,然后存储在 uint16_t 数组中。

谢谢。

【问题讨论】:

  • 您是否尝试从gmp 库中读取mpz/set_str.c:mpz_set_str()mpn/generic/set_str.c:mpn_set_str()
  • 另外,您误解了上一个答案中的信息,因此您的结构看起来很有趣。由于四肢使用的是 64 位类型,因此您的基数是 264,而不是 32 == 25。
  • 一个“学术项目”怎么不能使用GMP?你真的不想像他们已经拥有的那样高效和优化算法来实现代码。如果这是一个“家庭作业项目”,那么,当然,你被卡住了,如果它是一个“商业项目”,也许许可证不合适。但是对于学术用途,在 C 语言中,GMP 将为您节省大量工作。
  • @Rex - 我所说的学术是指家庭作业,但仍然属于项目性质。 @GregS - 谢谢,我刚刚向我的教授澄清,我们被允许使用固定大小的数组,所以我想我将使用 32 位或 64 位和固定大小来存储 1000 个十进制数字。 @J.F.塞巴斯蒂安:谢谢,我一直在看。由于 gmp 的深奥性,这有点难以理解,但它确实提供了一个很好的起点。

标签: c algorithm math types bignum


【解决方案1】:

你需要做算术,调用你的例程。例如,如果字符串是“2013”​​(十进制表示2013),则执行:a=0; a=10*a+2; a=10*a+0; a=10*a+1; a=10*a+3

【讨论】:

  • 一个可能一次取 9 位数,使用系统提供的 toInt() 转换,然后在乘法之前将其转换为 BigInt - 应该会增加一些效率。
  • 最后 9 位是指可以存储在基数的单个数字中的小数位数。这似乎是合理的。但是会有一个数字位于两个连续数字的交集处。我只是不知道如何处理这种情况(还)。
  • OpenSSL bn 就是这样做的。参见opensource.apple.com/source/OpenSSL098/OpenSSL098-27/src/crypto/…中的BN_dec2bn
  • @nn - 您不必担心连续数字的交集。一次做 9 个数字与一次做 1 个数字并没有什么不同 - 只是快一点。 2013 年的例子不是很好,因为它不会强迫你认为 a 是 BigInt 而不是 `int'。因此,步骤 1) 输入 = '12345123456789123456789',BigInt 结果 = new BigInt(0),BigInt 乘数 = BigInt(1) 2) 输入 = '12345123456789',结果 += 乘数 * int('123456789'),乘数 *= 1000000000 3) input = '12345', result += multiplier * int('123456789'), multiplier *= 1000000000, 4) //最后计算res。
猜你喜欢
  • 2015-12-08
  • 2012-11-27
  • 2010-12-07
  • 2014-04-25
  • 1970-01-01
  • 2020-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多