- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我要编写有关 RSA 的原始论文中提出的 Solovay-Strassen 素性检验的程序。
此外,我需要编写一个小型 bignum 库,因此在搜索 bignum 的方便表示时,我遇到了这个 specification :
struct {
int sign;
int size;
int *tab;
} bignum;
我还将使用 Karatsuba 方法编写乘法例程。
所以,对于我的问题:
在 bignum 结构中存储整数数据使用什么基比较方便?
注意:我不允许使用第三方或内置的 bignum 实现,例如 GMP。
谢谢。
最佳答案
2 的幂。
对于一个简单的实现,可能是你机器上一个字的一半大小,这样你就可以将两个数字相乘而不会溢出。所以 65536 或 4294967296。或者可能是最大整数类型大小的一半,出于同样的原因,但整体性能可能更好。
但我从未真正实现过这样的库:如果您使用的是最著名的算法,那么您就不会进行学校风格的长乘法运算。 Karatsuba 乘法(以及您使用的任何其他巧妙的技巧)可能会受益于以两倍于数字大小的整数来完成,我真的不知道性能如何。如果是这样,那么您最好使用 256 和 32 位算法,或者 65536 和 64 位算法。
在任何情况下,如果您的表示是二进制的,那么您可以为每个操作挑选和选择更大的二次幂的基数。例如,您可以将数据视为以 2^16 为基数进行乘法,但以 2^32 为基数进行加法。只要您注意字节顺序,一切都是一样的。我可能会从基数 2^16 开始(因为这迫使我一开始就获得字节顺序的正确性,而 2^8 则不会),然后看看我如何进行 - 随着每个操作都得到优化,部分优化是确定最佳碱基。
使用不是字节倍数的大小是可能的,但是你必须对所有内容使用相同的基数,因为根据基数,存储中的特定位置有未使用的位。
关于c - bignum 库和素性测试算法的方便基础是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2664219/
根据 OpenSSL 1.1.0's manual ,它说: BN_bin2bn() converts the positive integer in big-endian form of lengt
我想知道 BigInt 和其他类似的东西是如何实现的。我试图查看 JAVA 源代码,但对我来说全是希腊语和拉丁语。您能否用文字向我解释一下该算法 - 没有代码,以便我了解当我使用 JAVA API 中
我正在编写一个任意精度的有理数包,我需要测试它的正确性和效率。当然,我可以自己组合一组临时测试,但由于我远不是第一个这样做的人,所以我认为值得一问:任何人都可以推荐我可以使用的现有测试集吗? 编辑:我
所以我正在实现一个 BigNum 类来处理大整数,目前正在尝试修复我的字符串构造函数类。我必须能够读取数组中的字符串,例如“-345231563567”,其中的数字是向后读取的(即 765365132
我需要一个任意长度的二进制字符串的数字表示。这个看似微不足道的任务没想到却很复杂。到目前为止我能想到的最好的是 string.unpack('H*')[0].to_i(16) 但是这个操作缺乏可逆性,
我想使用 BIGNUM 的 BN_bn2bin 函数将这个十六进制字符串转换成原始二进制文件 BN_hex2bn(&asn1hash, "3031300D0609608648016503040
我要编写有关 RSA 的原始论文中提出的 Solovay-Strassen 素性检验的程序。 此外,我需要编写一个小型 bignum 库,因此在搜索 bignum 的方便表示时,我遇到了这个 spec
Python 提供了一种称为“long”的“bignum”类型,它可以表示任意大的数字。 这个类型的内部表示是什么? 我问的部分原因是我很好奇这些数字上哪些操作可能特别快或特别慢。例如,与乘法或除法相
我正在尝试使用 OpenSSL 库将表示大整数的字符串 p_str 转换为 BIGNUM p。 #include #include int main () { /* I shortened t
我正在尝试计算大数的阶乘。 def fact(n) num = 1 for i in 1..n num *= i end num end fact(90000) 在 Ruby
我正在尝试为 bignum 实现长除法。不幸的是,由于嵌入式编程的限制,我无法使用像 GMP 这样的库。此外,我想要学习如何实现它的智力练习。到目前为止,我已经使用任意长度的字节数组完成了加法和乘法(
我这里有一个简短的haskell函数,应该将“ABCDEF”转换为0x41,0x42,0x43,0x44,0x45,0x46(它们的ascii值),然后将它们相乘,使其变为0x4142,4344,45
#!/usr/bin/perl use strict; use warnings; my $s = "1234567890.123456789"; { no bignum; printf
我正在为 16 位嵌入式设备(80251 微 Controller )开发应用程序,我需要任意精度算法。有谁知道适用于 8051 或 80251 的库? GMP 没有明确支持 8051,我很担心在 1
我正在尝试为bignums 实现长除法。不幸的是,由于嵌入式编程的限制,我无法使用像 GMP 这样的库。此外,我想要学习如何实现它的智力练习。到目前为止,我已经使用任意长度的字节数组完成了加法和乘法(
我正在开发一个bignum库:http://pastebin.com/nFgF3zjW我实现了 Miller-Rabin 算法 (isprime()),但与 OpenSSL 的 BN_is_prime
我有以下代码: int MPIbcastBigNum(BIGNUM *num, int rank, char* purpoce){ int size = BN_num_bytes(num);
我需要在 C# 中重新创建一个 Rust 函数。到目前为止,这是我的 C#: public static string AsSha256Decimal(this string asci) {
我有以下功能: BIGNUM * multiplyWithInt(BIGNUM *bn, int val){ //Logic Here } 我尝试做的是计算乘法 bn*val。根据文档(从命令 m
我试图在 C 中创建一个矩阵,其中每个元素都是一个 Bignum(来自 Openssl 库)。我原以为它会是这样的,但它不起作用。 BIGNUM *p [2][2] = NULL; int i;
我是一名优秀的程序员,十分优秀!