求一个数的相反数算法(inverse to X modulo (1 << MOD))
(相反数的定义是:求Y 使(X * Y) mod (1 << MOD) ==  1)

/*
 */param x X:inverse to X modulo (1 << MOD)
 */param mod MOD:inverse to X modulo (1 << MOD)
 */return the inverse number
 */
static unsigned long inverse (unsigned long x, int mod)

 unsigned long mask = ((unsigned long) 1 << (mod - 1) << 1) - 1;
 printf("mask=%lu,%x/n",mask,mask);
 unsigned long rslt = 1;
 int i;
 for (i = 0; i < mod - 1; i++)
  {  
  rslt = (rslt * x) & mask;  
  x = (x * x) & mask;
  //printf("%d) rslt=%lu/tx=%lu/n",i,rslt,x);
 } 
 return rslt; 
}

一般的算法都是用Euclidean的逆步骤去解,但是这个算法不是。这个算的基本原理如下:
X为奇数时,存在0<i<mod,使得X^(2^i) % (2^mod) = 1
(这个我证明了一下,不难,我就不贴了)
即:X,X^2,X^4,X^8,X^16……X^2^(mod-1)里面一定有一个数,使X^(2^i) % (2^mod)=1
然后,X^(2^i-1)即为所求。

还有一个定理需要说明:X*Y % a =(X % a)*(Y % a) % a,
也就是:两个数相乘后取模,等于取模后相乘,再取模。这个也不用证明了吧。

注意算法里的mask=2^mod - 1 ,二进制表示为111111(mod个1)
ps.不知道为什么写成 1<<(mod-1)<<1 - 1,而不直接写成 1<<mod - 1
进行a & mask操作,相当于进行a%(2^mod)操作。
这是用&操作进行的优化。

现在看循环里的操作就比较简单了:
(先不看rslt)
循环里的X不断自乘,然后后取模,
所以X的值依次为
X(初始值)

附测试函数:
int main()
{
 unsigned long x;
 int mod;
 scanf("%lu %d,",&x,&mod);
 printf("%lu ",inverse(x,mod));
 return 0;
}

求一个数的相反数算法相关推荐

  1. 求一个数的相反数的补码

    1.已知8位二进制表示的整数X的补码为10011011,则-X的补码的二进 制编码为( 01100101 ). 解析:已知x和-x的反码是互为相反的,所以已知x的补码,[x]反 = [x]补  - 1 ...

  2. 为了得到一个数的“相反数“,我们将这个数的数字顺序颠倒,然后再加上原先的数得到“相反数“。

    为了得到一个数的"相反数",我们将这个数的数字顺序颠倒,然后再加上原先的数得到"相反数".例如,为了得到1325的"相反数",首先我们将该数 ...

  3. 求N个数的最大公因数(算法)

    在一般的程序设计书里面,都有关于求两个数的最大公因数的算法(或者叫做最大公约数).求两个数的最大公约数算法用的最多的是辗转相除法. 基本思路就是 getCommonMutiple(a,b){  //这 ...

  4. Python:实现求一个数的位数之和算法(附完整源码)

    Python:实现求一个数的位数之和算法 from timeit import timeit def sum_of_digits(n: int) -> int:n = -n if n < ...

  5. 找到一个或多个多重定义的符号_初中数学之相反数,总结规律,学会多重符号的化简...

    今天继续和大家一起来学习初中数学,初一的相关知识,在前面已经介绍了正数和负数,对于有理数也有了清楚的认识,今天我们来学习相反数,相反数的概念和表示是中考命题的热点之一,经常结合其他知识点一起考察,本节 ...

  6. 求3个数的最小公倍数算法之数论进阶

    求3个数的最小公倍数算法之数论进化 https://blog.csdn.net/number1killer/article/details/104960548 求3个数的最小公倍数算法之数论再细化 h ...

  7. 求3个数的最小公倍数算法之数论再细化

    求3个数的最小公倍数之便捷算法(C# ) https://blog.csdn.net/number1killer/article/details/104681168 求3个数的最大公约数之算法研究集成 ...

  8. 求3个数的最小公倍数算法之数论进化

    求3个数的最小公倍数算法之数论再细化 https://blog.csdn.net/number1killer/article/details/104902304 求3个数的最小公倍数之便捷算法(C# ...

  9. 两数之差的补码等于被减数的补码与减数相反数的补码。_二进制的原码、反码、补码...

    一.十进制与二进制的相互转换 1. 十进制转换为二进制,分为整数部分和小数部分. 整数部分采用除2倒取余法,具体做法:用2去除十进制整数,可以得到一个商和余数:在用2去除商,又会得到一个商和余数,如此 ...

最新文章

  1. “智源论坛Live”报名 | 清华大学游凯超:领域适配前沿研究--场景、方法与模型选择...
  2. XML中的CDATA是什么
  3. BZOJ1782[USACO 2010 Feb Gold 3.Slowing down]——dfs+treap
  4. C#中线程池的简单应用
  5. synchronized实现可见性对比volatile
  6. 在数组中找重复数、只出现一次的数或丢失数的题目(Leetcode题解-Python语言)
  7. 阿里巴巴开源的通用缓存访问框架JetCache介绍
  8. 面向对象程序设计的4个主要特点
  9. 基于LOAM框架的激光SLAM开源程序汇总
  10. 体验极速Android SDK的更新与下载
  11. python(3)-内置函数2
  12. 记录SpringSecurity jwt问题
  13. 台达A2/B2伺服电机编码器改功率软件 台达A2/B2伺服电机编码修改, 用于更换编码器写匹配电机参数
  14. 笔记本键盘有几个键失灵了怎么办?
  15. 读取数据快慢的设备_目前在以下各种设备中,读取数据快慢的顺序是内存、硬盘、光盘和软盘。...
  16. rdma_RDMA:基本原理和自举探索
  17. 为了面试能通过,我要看完这75道面试题(下)
  18. C陷阱篇之char的默认符号
  19. 织梦DEDECMS QQ一键登录插件返回空白解决方法
  20. [BX]、loop、inc、dec指令

热门文章

  1. 别猜了,除了泷泽萝拉,小辣椒成功逆袭的秘密全在这里
  2. 出差高铁降噪高音质蓝牙耳机,时尚小巧高续航
  3. java long类型大小_java中long类型占多少字节
  4. pycharm使用plt不显示图片解决方案
  5. 使用Docker实现容器化(一)——Docker基础的介绍与应用
  6. css33d摩天轮动画
  7. android 手机型号_如何找出您拥有的Android手机型号
  8. Mysql索引类型及区别
  9. element表格自定义排序
  10. 服务器中Redis清除缓存