DH算法源程序_第1页
DH算法源程序_第2页
DH算法源程序_第3页
DH算法源程序_第4页
DH算法源程序_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、DH算法的C语言实现1. class SuperNumber 2. public:3.     SuperNumber() 4.         memset(data, 0, MAX_SIZE);5.         high = 0;6.     7.   

2、0; / 一般整型到SuperNumber的转换,该版本中不支持负数8.     SuperNumber(unsigned long l) 9.         memset(data, 0, MAX_SIZE);10.         high = 0;11.     

3、;    while(l) 12.             data+high = l % 10;13.             l /= 10;14.         

4、15.     16.     / str为字符串形式表示的十进制数17.     SuperNumber(const char* str) 18.         assert(str != NULL);19.         high =

5、0;strlen(str);20.         for(int i = high, j = 0; i >= 1; i-, j+) 21.             datai = strj - '0'22. 

6、0;       23.     24.     SuperNumber(const SuperNumber& s) 25.         memcpy(data, s.data, MAX_SIZE);26.         hi

7、gh = s.high;27.     28.     operator const char*() const 29.         return toString(10);30.     31.     SuperNumber& operator=(const

8、60;SuperNumber& s) 32.         if(this != &s) 33.             memcpy(data, s.data, MAX_SIZE);34.           

9、  high = s.high;35.         36.         return *this;37.     38.39.     / 将数据置为040.     void reset() 41.   

10、60;     memset(data, 0, MAX_SIZE);42.         high = 0;43.     44.45.     / str为字符串形式表示的十进制数46.     void setToStr(const char* str) 

11、;47.         assert(str != NULL);48.         high = strlen(str);49.         for(int i = high, j = 0; i >= 1;

12、0;i-, j+) 50.             datai = strj - '0'51.         52.     53.     / 将数据转换成以base指定的进制的字符串形式,默认为十进制54.  

13、0;  const char* toString(int base = 10) const 55.         static char bufMAX_SIZE;56.         const char table = "0123456789ABCDEFGHIJKLMNOP

14、QRSTUVWXYZ"57.58.         if(high = 0) return "0"59.60.         assert(base >= 2);      / 指定的进制应该不小于261.62.      

15、;   / 进制转换63.         bufMAX_SIZE-1 = '/0'64.         int begin = MAX_SIZE-1;65.         char tempMAX_SIZE;66.   

16、;      memcpy(temp, data, MAX_SIZE);67.         while(1) 68.             / 找最高位的起始位置69.           &#

17、160; int h = high;70.             while(temph = 0 && h >= 1) h-;71.             if(h = 0) break;72.

18、73.             / 除基取余74.             int t = 0;75.             while(h >= 1) 76.

19、                t = t * 10 + temph;77.                 temph = t / base;78.   &#

20、160;             t = t % base;79.                 h-;80.             81. &#

21、160;           buf-begin = tablet;82.         83.84.         return buf+begin;85.     86.87.     / 乘法88.

22、    SuperNumber operator*(const SuperNumber& s) const 89.         SuperNumber result;     / default set to 090.         i

23、nt i, j;91.         92.         / 相乘93.         for(i = 1; i <= high; i+) 94.         &

24、#160;   for(j = 1; j <= s.high; j+) 95.                 int k = datai * s.dataj + result.datai+j-1;96.      

25、;           result.datai+j-1 = k % 10;97.                 result.datai+j += k / 10;98.       &#

26、160;     99.         100.         / 进位101.         for(i = 1; i < MAX_SIZE - 1; i+) 102.   &

27、#160;         if(result.datai >= 10) 103.                 result.datai+1 += result.datai / 10;104.       &#

28、160;         result.datai %= 10;105.             106.         107.         / 确定最高位108.   &

29、#160;     for(i = MAX_SIZE-1; i >= 1 && result.datai = 0; i-);109.         result.high = i;110.111.         return resu

30、lt;112.     113.114.     / 除法,内部调用doDivide来实现115.     SuperNumber operator/(const SuperNumber& s) const 116.         SuperNumber q, r;117.    

31、;     doDivide(s, q, r);118.         return q;119.     120.     / 模运算,内部调用doDivide来实现121.     SuperNumber operator%(const SuperNumber& s

32、) const 122.         SuperNumber q, r;123.         doDivide(s, q, r);124.         return r;125.     126.127.   

33、0; / 除法运算,一次除法运算中同时得到商和余数,运算符/和%的重载128.     / 内部会调用这个函数,dest为除数,Q为商,R为余数,算法使用试除法129.     void doDivide(const SuperNumber& dest, SuperNumber& Q, SuperNumber& R) const 130.    

34、;     int i, j, t;131.132.         Q.reset();133.         Q.high = high - dest.high + 1; / 商的初始位数134.       &#

35、160; R = *this;                     / 余数初始实为被除数135.         t = dest.high;136.        

36、0;/ 判断除法是否结束137.         while(R >= dest) 138.             / 循环相减进行试除139.             while(dest >= 

37、;R.sub(1, t) 140.                 Q.dataQ.high- = 0;141.                 +t;142.       

38、60;     143.             while(R.sub(1, t) >= dest) 144.                 / i为相减时被除数最低下标,j为除数最低下标145.  

39、               for(i=R.high-t+1,j=1; j<=dest.high; i+,j+) 146.                     R.datai -= des

40、t.dataj;147.                     if(R.datai < 0) 148.                      &#

41、160;  R.datai += 10;149.                         R.datai+1 -= 1;150.              

42、60;      151.                 152.                 while(R.datai < 0 && i 

43、<= R.high) 153.                     R.datai += 10;154.                     R.

44、datai+1 -= 1;155.                     +i;156.                 157.        &

45、#160;        Q.dataQ.high += 1;158.             159.             / 一次试除结束,更新商的最高位下标160.       &

46、#160;     Q.high -= 1;161.             / 更新被除数的最高位下标162.             while(R.dataR.high = 0) 163.     

47、60;           R.high-;164.                 t-;165.             166.       &

48、#160;     t+=1;               / 下一位被除数167.         168.169.         Q.high = high - dest.high&#

49、160;+ 1; 170.         while(Q.dataQ.high = 0) Q.high -= 1;171.         R.high = high;172.         while(R.dataR.high = 0)

50、0;R.high -= 1;173.     174.175.     / 大数模幂算法,很简单的自然算法,即将指数分解为二进制,换句176.     / 更简单的话来说,就是不断地找平方模幂,而不是全部乘方后再177.     / 做一次最终的模运算178.     / a.power_mod(p, n)计算ap m

51、od n179.     SuperNumber power_mod(int power, SuperNumber n) const 180.         SuperNumber c("1"), t(*this);181.182.         while(power) 1

52、83.             if(power % 2) 184.                 c = c * t % n;185.        

53、60;        power -= 1;186.              else 187.                 t = t * t 

54、;% n;188.                 power /= 2;189.             190.         191.192.      

55、;   return c%n;193.     194.195.     bool operator>=(const SuperNumber& s) const 196.         if(high = s.high) 197.       

56、      int k = high;198.             while(datak = s.datak && k >= 1)k-;199.             if(k&#

57、160;< 1) return true; / equal200.             return datak > s.datak;201.          else if(high > s.high) return true;202

58、.         return false;        203.     204.205.     bool operator<(const SuperNumber& s) const 206.        

59、 return !(*this >= s);207.     208.209.     / 从十进制表示的最高位开始数起,数到第i位,从第i位开始截取连续210.     / 的c位数字出来组成一个新的数。例如:数据是,则211.     / sub(3, 5)返回数字34567,如果数字不够取,例如在34567上运行212.   

60、  / sub(3, 5),因为34567从高位数起第3个数字是5,剩下的数字是567,213.     / 最多只有三个,不够取要求的5个,这个时候返回567,不报错。214.     SuperNumber sub(int i, int c) const 215.         SuperNumber ret;2

61、16.         assert(high >= i);   / 保证可截取217.218.         i = high - i + 1;    / 从高位数起的第i个数位的下标219.      

62、60;  if(i >= c) 220.             ret.high = c;221.             while(c >= 1) ret.datac- = datai-;222.   

63、       else 223.             ret.high = i;224.             while(i >= 1) 225.      

64、0;          ret.datai = datai;226.                 i-;227.             228.     

65、     229.         / 过滤前导0230.         while(ret.dataret.high = 0) ret.high-;231.         return ret;232.     2

66、33.234.     / I/O235.     friend istream& operator>>(istream& in, SuperNumber& s) 236.         char t256;237.         in&#

67、160;>> t;238.         s.setToStr(t);239.         return in;240.     241.     friend ostream& operator<<(ostream& out, const S

68、uperNumber& s) 242.         return out << s.toString(10);243.     244. private:245.     enum MAX_SIZE=256;        / 最大十进制位数246.  &

69、#160;  / 须注意,使用data0存储最高位所在下标是自己的一点小聪明,后来在247.     / 调试的时候发现这是一个极大的错误,不过对于此题目来说可以应付248.     char dataMAX_SIZE;        / 数据的内部表示,字符串形式的十进制249.         

70、                        / 其中data0存储最高位所在下标,data1250.                     &#

71、160;           / 存储数据的最低位,也就是个位251.     int high;252. ;主函数:1. int main(int argc, char *argv) 2.     freopen("in.txt", "r", stdin);3.4.     SuperNumberTest st;5.6. /    st.run();7.8.     / g和n都是超过2127的素数。它们在DH算法中公开9.     SuperNumber g,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论