- 论坛徽章:
- 15
|
本帖最后由 yulihua49 于 2011-10-28 15:53 编辑
对于表达式(数字均为十进制数): (319570873830358677766204855298122686115^26788392849192711860555115 ...
sh365 发表于 2011-10-28 12:47 ![]()
这是很普通的算法啊!在ssl里有。
在密码学用的大数是在有限域,应该是大的正整数。
2楼算法的程序实现:- #include <stdio.h>
- #include "bignum.h"
- /* ret = a ** z % n */
- u_int *expmod(int n,u_int *a,u_int *z,u_int *m,u_int *ret)
- {
- u_int a1[MAXNUMBER+1];
- u_int z1[MAXNUMBER+1];
- u_int x[MAXNUMBER+1];
- numcpy(n,a1,a);
- numcpy(n,z1,z);
- n_one(n,x);
- while(!n_iszero(n,z1)) {
- while(!(z1[0]&1)) {
- rshift(n,z1,1);
- /* a1 = (a1 *a1) % m; */
- mulmod(n,a1,a1,m,a1);
- }
- decm(n,z1);
- /* x = (x*a1) % m; */
- mulmod(n,x,a1,m,x);
- }
- numcpy(n,ret,x);
- return ret;
- }
复制代码 数由uint32_t数组表示,n是数组的大小。
其他任何格式表示的数字可以经过转换进入数组。 |
|