Tag: bignum

Bignum除法与无符号8位整数。 C

我已经创建了一个算法,用于将整数最大为255字节的整数除以8位整数,并且它可以用于我已经完成的测试。 有没有人对此有任何意见或任何改进建议? 有没有更好的算法用于此目的? 我不希望bignum通过bignum除法算法,第二个整数是8位整数。 迄今为止的最佳解决方案(小端): typedef struct{ u_int8_t * data; u_int8_t length; }CBBigInt; void CBBigIntEqualsDivisionByUInt8(CBBigInt * a,u_int8_t b,u_int8_t * ans){ // base-256 long division. u_int16_t temp = 0; for (u_int8_t x = a->length-1;; x–) { temp <data[x]; ans[x] = temp / b; temp -= ans[x] * b; if (!x) break; } a->length -= ans[a->length-1]? 0 […]

如何为PRNG播种BN_generate_prime

我无法在openssl / bn.h中找到关于用BN_generate_prime生成素数的答案。 另外,我如何播种此函数使用的PRNG? 单独的问题,但与我的代码相关(我正在编写一个程序来生成RSA密钥对):我如何检查是否在BIGNUM中设置了高阶位? 假设我生成512位素数。 我会使用BN_is_bit_set(素数,512)吗? 谢谢

当没有数据类型可以保存完整数字时,将hex转换为十进制

好的,所以我在C中使用PIC微处理器。它是一个16F,因此它不能保存大于32位的整数(unsigned int32是可用的最大数据量) 从阅读器,我收到一个5字节的ID代码。 为了传输它,我必须逐位编码为BCD。 我无法将其打印到字符串,因为它比数据大小大,并且无法处理它。 我无法分割它,因为没有为它定义操作。 我无法找出任何解决方案,有没有人以前处理过这个问题? 编辑: 我收到一系列5个字节的数字:“FF-FF-FF-FF-FF”。 我需要将其转换为十进制“0123456789012”(13位数,长度为256 ^ 5十进制),以通过RS232发送。 第二个函数(使用ASCII,并发送它)我已经有它工作,但我需要完整数字的字符串表示,然后我可以用它做任何事情。

C中的自定义数据类型

我正在使用加密技术,需要使用一些非常大的数字。 我也在使用新的Intel无指令乘法指令,它需要m128i数据类型,这是通过加载一个以浮点数据作为参数的函数来完成的。 我需要存储2 ^ 1223整数,然后将其平方并存储该值。 我知道我可以使用GMP库,但我认为创建两种数据类型(包括2 ^ 1224和2 ^ 2448等值)会更快。 它将有更少的开销。我将使用karatsuba乘以数字,所以我需要对数据类型执行的唯一操作是添加,因为我将打破数字以适应m128i。 有人可以指导我朝着可以帮助我创建我需要的整数大小的材料的方向。

C中的大数减法

大约20分钟前,我刚刚在一门介绍性的C课程中完成了考试。 关于考试的第一个问题让我措手不及,并且找到了两个大数字的差异。 目标是按值获取两个结构(N1和N2),并将差异存储在通过引用传递的结构中(N3)。 我们被允许假设N3是以所有’0’开始的。 MAX大小可以是任何值,因此如果数字超过100位,解决方案仍然有效。 这是基本代码(原始可能略有不同,这是来自内存) #include #include /* MAX can be any length, 10, 50, 100, etc */ #define MAX 10 struct bignum { char digit[MAX]; char decimaldigit[MAX/2]; }; typedef struct bignum bigNum; void difference(bigNum, bigNum, bigNum *); /* Original values in N1 and N2 N1.digit = { ‘0’, ‘0’, ‘0’, ‘5’, ‘4’, ‘8’, […]

将真正的大数字从二进制转换为十进制并打印出来

我知道如何将二进制转换为十进制。 我知道至少2种方法:桌子和电源;-) 我想将二进制转换为十进制并打印此十进制。 而且,我对这个“十进制”不感兴趣; 我想要打印它。 但是,正如我上面所写,我只知道将二进制转换为十进制的两种方法,并且它们都需要添加。 所以,我在二进制中计算1或0的某个值,并将其添加到记忆值。 这是一个很薄的地方。 我有一个非常大的数字(1和64个零)。 转换时我需要在某些“变量”中放置一些中间结果。 在C中,我有一个`int’类型,它只有4个字节,不超过10 ^ 11。 因此,在从二进制转换为十进制时,我没有足够的内存来存储中间结果。 正如我上面写的那样,我对这个十进制不感兴趣,我只想打印结果。 但是,我没有看到任何其他方法来解决它;-(是否有任何解决方案从二进制“只打印”? 或者,也许,我应该使用类似BCD(二进制编码的十进制)的东西进行中间表示? 我真的不想使用这个,因为它不是那么跨平台(英特尔的处理器有内置function,但对于其他我需要编写自己的实现)。 我很高兴听到你的想法。 谢谢你的耐心等待。 语言:C

如何序列化GMP mpf类型?

似乎GMP只提供了mpf(浮点)类型的字符串序列化: mpf_get_str() , mpf_class::get_str() mpz(整数)类型具有原始字节的附加接口: mpz_out_raw() http://gmplib.org/manual/Function-Index.html 我错过了什么吗? 有谁知道可以序列化GMP浮标的另一个库? 有谁知道另一个提供强大序列化的bignum lib? 编辑:我很高兴序列化MPFR的mpfr_t,同样似乎只提供字符串输出: http ://www.mpfr.org/mpfr-current/mpfr.html#Function-Index

GMP如何以任意数量的字节存储其整数?

2 ^ 64离我的ram /硬盘驱动器可以处理的“无限”还有一段距离…… 首先,我想知道GMP如何与内存/处理器一起工作,因为它做了一些阴暗的优化…… 我还想知道是否有一种方法可以在任意数量的字节上存储整数(无符号,更容易)。 例如,在50个字节上,我的上限为2 ^ 400 -1。 要做的事情是使用携带以保持数字从一个字节到另一个字节保持一致,我对此有一些了解,但我真的不确定这是否是最快的方法。 我甚至不确定我是否正确。 我猜GMP使用这种方式来存储它的数据,但我只想要一些(甚至很少)解释或某些理论转发(我没有任何博士学位,所以不要太难)。

使用GMP的bignum方根

我需要准确地得到210位数的平方根,我认为GMP是适合这项工作的工具,我做错了什么? #include #include #include “gmp.h” int main (int argc, char *argv[]) { mpz_t sq_me, sq_out, test; mpz_init(sq_me); mpz_init(sq_out); mpz_init(test); mpz_set_str (sq_me, argv[1], 10); mpz_sqrt(sq_out, sq_me); mpz_mul(test,sq_out,sq_out); gmp_printf (“%Zd\n\n”, sq_out); gmp_printf (“%Zd\n\n”, test); return 0; } 输入: 24524664490027821197651766357308801846702678767833275974341445171506160083003858 72169522083993320715491036268271916798640797767232430056005920356312465612184658 17904100131859299619933817012149335034875870551067 输出: 49522383313031109809242226159886283348695660460381271324714928680654813093947239 9634016783775955618921028 24524664490027821197651766357308801846702678767833275974341445171506160083003858 72169522083993320715491034366358025027526868495267716284867043049443779615862887 47102011391915422793532619329760963626718900576784

将二进制转换为十进制的最快方法?

我有四个无符号的32位整数,表示无符号的128位整数,以小端序排列: typedef struct { unsigned int part[4]; } bigint_t; 我想将此数字转换为十进制字符串表示forms并将其输出到文件中。 现在,我正在使用bigint_divmod10函数将数字除以10,跟踪余数。 我重复调用这个函数,输出余数作为数字,直到数字为零。 这很慢。 这是最快的方法吗? 如果是这样,有没有一种聪明的方法来实现我没有看到的这个function? 我试过看GMP的get_str.c ,但我发现它非常get_str.c 。 编辑:这是我能够为divmod10函数提出的最快的代码: static unsigned uint128_divmod10(uint128 *value) { unsigned int a = value->word[3]; unsigned int b = value->word[2]; unsigned int c = value->word[1]; unsigned int d = value->word[0]; unsigned int diva = a / 5; unsigned int divb = […]