-
2021-04-19 21:51:40更多相关内容
-
易语言大数幂模运算
2020-07-23 00:32:26易语言大数幂模运算源码,大数幂模运算 -
模运算与奇偶数判断
2021-01-08 06:28:14模运算 如果N整除 A – B,那么我们就说A与B模N同余(congruent),记为A≡B(modN)A \equiv B\pmod{N}A≡B(modN)直观地看,这意味着无论A还是B被N去除,所得余数都是相同的。于是,81≡61≡1(modN)81 \equiv 61 \equiv... -
补码,模运算和溢出
2021-07-26 03:51:37在现代计算机中,补码主要用来表示整数(数值整数),CPU在补码的基础上实现加法运算,减法也通过加法来实现(Intel x86的CPU中,都有加法器和乘法器,用加法器实现减法,用乘法器实现除法;...在模运算系统中,若A,...在现代计算机中,补码主要用来表示整数(数值整数),CPU在补码的基础上实现加法运算,减法也通过加法来实现(Intel x86的CPU中,都有加法器和乘法器,用加法器实现减法,用乘法器实现除法;当然,某些高级CPU还可能会有更先进的计算部件,一个指令直接进行\(\sin\)和\(\cos\)等计算)。本文总结补码相关知识。
先说说模运算(mod):
模可以理解为一个正数,一个上界。在模运算系统中,若A,B,M满足这个关系:\(A=B+K \times M\),K为整数,则记为:\(A \equiv B \pmod M\)。即A,B各除以M后的余数相同,故称B和A为模M同余。也就是说在一个模运算系统中,一个数与它除以模后得到的余数是等价的(这里没有考虑负数)。时钟系统,就是最典型的模运算系统,模是12或24。
补码跟模运算啥关系:
假设现在钟表时间是10点,要将它拨到6点,有两种拨法:
1, 倒拨4个小时;
2, 顺拨8个小时;
所以,在模12系统中,\(10-4 \pmod {12} \equiv 10+8 \pmod {12}\)
上式也可以写为:\(-4 \equiv 8 \pmod {12}\)
于是,我们可以说,8是-4对模12的补码。
结论:对于某一个确定的模,某数A减去小于模的另一个数B,可以用A加上(-B)的补码来代替!
这就是为什么补码可以借助加法运算实现减法运算的道理。
补码的定义
1, 正数的补码就是它本身;
2, 负数的补码等于模与该负数绝对值之差。
(如果计算之后还是负数,继续迭代,比如:\(-7 \pmod 3 \equiv 2\))
因此,某一个数的补码,不管它是正是负,其补码都是正数!
在计算机中,一般情况下,一个整数由\(n=32\)bit位来表示,正好有符号整数在现代计算机中基本都使用补码来表示。对于有符号的整数,第一位是符号位,那么,有符号整数的模就是\(2^n\)。(n-1个bit的有效数据,模就是2的n次方)
我们定义:
1, 对于n为有符号整数定点整数(小数点在最右边),补码为:
\([X_T]_{补}=(X_T+2^n) \pmod {2^n}\)
\((-2^n \le X_T \lt 2^n)\)
2, 定点小数(小数点在最左边),补码为:
\([X_T]_{补}=(X_T+2) \pmod {2}\)
\((-1 \le X_T \lt 1)\)
从上面定义可以很容易的看出,有效位全0时的补码表示的是负的最小值,因此对于8bit的有符号数,表示范围是-128到127.
补码0的表示是唯一的,机器数表示,不管是定点整数,还是定点小数,都是全0。这样带来了两个好处:
1, 0的表示唯一,减少了+0和-0之间的转换;
2, 少占用一个编码表示,使补码比原码能多表示一个最小负数。
补码的计算
可以通过定义证明补码在计算机中的计算规则:对于正数,符号位是0,补码就是其本身,无需计算;对于负数,符号位保持1,其余各位由真值的数值部分“各位取反,末尾加1”得到。
计算机来做取反很easy,再加上1,就能的负数的补码,因此,可以很容易地将减法转换成加法运算。(如果用原码表示负数,计算过程就会复杂许多)
反过来看看,如果从补码来反算出真值:
对于正数,补码的数值部分不做改变,跟原码一样,直接就能得到真值;
对于负数,将计算补码的过程反过来,将补码数值部分减1,然后再各位取反,符号位保持1。
再看看如何从\([X_T]_{补}\)求出\([-X_T]_{补}\):
还是“各位取反,末尾加1”,但是这次要连通符号位一起取反。
需要注意的是:最小负数取负后的补码表示是不存在的,如果对最小负数取负数,结果会溢出。
关于溢出(overflow)
确定位数的两个数的计算结果,有可能无法在同样的位数范围内表示出来,这时就发生了溢出。溢出的发生是因为产生了进位,而计算机由于存储限制,进位会被丢弃。
有的时候,这种丢弃是允许的,比如两个相同符号数相减,或者两个异号数相加。这时的溢出,恰好就是模运算,最后得到的结果正确。前面说到,如果对最小负数取负,结果会溢出,机器数的结果是没有变化。程序员需要特别注意。
有的计算机采用一种双符号位的补码表示,成为变形补码,也称为模4补码。在这种补码系统中,左符号是真正的符号位,右符号用来判别溢出。
无符号编码
有符号整数在计算机内,使用补码表示,因为这样减法和转换成加法,加快CPU的计算;
无符号整数在计算机内,有一种说法,使用无符号编码表示,其实就是原码表示,简单直接。
C语言中,要特别注意有符号数和无符号数混合运算的情况,系统会默认将有符号数也当成无符号数来对待,计算结果也是无符号数。
无符号编码在计算时,也会有溢出。
-
关于2型模糊集及其t模运算
2021-03-17 02:37:16在本文中,我们讨论了线性有序集上的模糊真值的一般二元运算的t范数展开操作,其中单位间隔和实数设置为特例。 在此基础上,讨论了2型模糊集的t范运算和2型模糊数的性质。 -
模运算公式整理
2021-02-09 22:33:39整理ACM中常用的模运算公式,包括加减乘除、幂运算。数论 - 模运算
加减乘除
(个人习惯, m o d mod mod 表示用来取模的数。)
加法: ( a + b ) % m o d = ( a % m o d + b % m o d ) % m o d (a+b) \% mod = (a \%mod + b\%mod)\%mod (a+b)%mod=(a%mod+b%mod)%mod
减法: ( a − b ) % m o d = ( a % m o d − b % m o d ) % m o d (a-b) \% mod = (a \%mod - b\%mod)\%mod (a−b)%mod=(a%mod−b%mod)%mod
乘法: a × b % m o d = ( a % m o d × b % m o d ) % m o d a \times b \%mod=(a\%mod\times b\%mod)\%mod a×b%mod=(a%mod×b%mod)%mod
除法:
-
可以用逆元:
- b a % m o d = b × a m o d − 2 % m o d \frac ba\%mod=b\times a^{mod-2}\%mod ab%mod=b×amod−2%mod,其中 m o d mod mod 为素数(根据费马小定理)。
- b a % m o d = b × a ϕ ( m o d ) − 1 % m o d \frac ba\%mod=b \times a^{\phi(mod)-1}\%mod ab%mod=b×aϕ(mod)−1%mod,其中 a a a 与 m o d mod mod 互质(根据欧拉定理)。但也可以由欧拉函数的性质推出, a ϕ ( m o d ) − 1 a^{\phi(mod)-1} aϕ(mod)−1 = a m o d − 1 − 1 =a^{mod-1-1} =amod−1−1 = a m o d − 2 =a^{mod-2} =amod−2。
-
不能用逆元: b a % m o d = a % m o d × b b \frac ba\%mod=\frac {a\%mod\times b}{b} ab%mod=ba%mod×b
- 证明:
a b m o d k = d a b = k x + d a = k b x + b d a m o d k b = b d a m o d k b b = d \frac ab\mod k = d \\ \frac ab=kx+d\\ a=kbx+bd\\ a\mod kb=bd\\ \frac {a \mod kb}{b}=d bamodk=dba=kx+da=kbx+bdamodkb=bdbamodkb=d
- 证明:
板子如下:
LL qm (LL a, LL b ,LL c){ //要取模 LL res = 1; while(b){ if(b & 1) res = res * a % c; a = a * a % c; b = b >> 1; } return res; } LL inv(LL x) {return qm(x, mod - 2, mod);} //四种取模运算 LL add(LL x, LL y) {return (x % mod + y % mod) % mod;} LL sub(LL x, LL y) {return (x % mod - y % mod) % mod;} LL mul(LL x, LL y) {return x * y % mod;} LL div_1(LL x, LL y) {return x * inv(y) % mod;} //可以求逆元的情况 LL div_2(LL x, LL y) {return x % mod * y / y;} //不能求逆元的情况
幂运算
欧拉降幂。
a b % p = { a b % ϕ ( p ) % p g c d ( a , p ) = 1 a b % p g c d ( a , p ) ≠ 1 , b < ϕ ( p ) a b % ϕ ( p ) + ϕ ( p ) % p g c d ( a , p ) ≠ 1 , b ≥ ϕ ( p ) a^b\%p=\left\{ \begin{aligned} &a^{b\%\phi(p)}\%p& \quad gcd(a,p)=1\\ &a^b\%p& \quad gcd(a,p) \neq1,b<\phi(p)\\ &a^{b\%\phi(p)+\phi(p)}\%p& \quad gcd(a,p) \neq1,b\ge\phi(p)\\ \end{aligned} \right . ab%p=⎩⎪⎪⎨⎪⎪⎧ab%ϕ(p)%pab%pab%ϕ(p)+ϕ(p)%pgcd(a,p)=1gcd(a,p)=1,b<ϕ(p)gcd(a,p)=1,b≥ϕ(p)此处仅给出第三种情况(常用)的代码。
LL qm(LL a, LL b, LL c) { LL res = 1; while (b) { if (b & 1) res = res * a % c; a = a * a % c; b >>= 1; } return res; } LL jm(LL a, LL b) { //欧拉降幂 LL mi = b % phi(mod) + phi(mod); return qm(a, mi, mod); }
-
-
Python中的模运算
2021-01-12 20:46:59所谓取模运算,就是计算两个数相除之后的余数,符号是%。如a % b就是计算a除以b的余数。用数学语言来描述,就是如果存在整数n和m,其中0 <= m < b,使得$ a = n * b + m $,那么$ a \% b = a - n * b = m $。...所谓取模运算,就是计算两个数相除之后的余数,符号是%。如a % b就是计算a除以b的余数。用数学语言来描述,就是如果存在整数n和m,其中0 <= m < b,使得$ a = n * b + m $,那么$ a \% b = a - n * b = m $。
先测试几个例子:
print(9%5) # 4
print(-9%5) # 1
print(9%-5) # -1
print(-9%-5) # -4
可以看到,数值部分虽然相同,但是正负符号的四种不同组合,会产生完全不同的四种结果。那么这里面有什么规律吗?
实际上,虽然结果不一样,不过取模运算完全遵从统一的规则:
其中$\lfloor\frac{a}{b}\rfloor$表示a除以b的结果向下取整。
比如$9\%5$,先计算$\lfloor\frac{9}{5}\rfloor$,向下取整得到1,然后计算$9-1*5$,得到4;
同理$-9\%5$,先计算$\lfloor\frac{-9}{5}\rfloor$,向下取整得到-2,然后计算$-9-(-2*5)$,得到1;
再来看$9\%-5$:
最后是$-9\%-5$:
虽然知道结果是如何计算出来的,不过人脑不比电脑,这样计算未免太复杂,为避免给大脑增加负担,再根据上面的规则,这里我总结了一个简单的记忆方法:
对于不带负号的,2个数字都是正数的,直接求结果,这个应该来说是比较简单的,而且无论符号是什么,我们都只计算这个值;
对于有负号的,不管负号在哪个数字,都去除负号,然后计算步骤1的结果;
接下来根据负号的位置分为3种情况,假设除数是K,去掉负号后取模的结果是M:2个数都是负数,直接等于-M
被除数是负数,除数是正数,由于是向下舍入,最后相当于会多加上一个K,也就是说模一定是大于0的,结果是K-M
被除数是正数,除数是负数,刚好相反,结果是M-K,注意这里的K是除数的绝对值,是正数
简单归纳:
不管有没有负数,先按正数求模得到M
2个数都为负数,结果是-M
只有1个数为负数,负数在上,记住结果一定是正的,大数-小数(除数-余数),那么就是K-M
只有1个数为负数,负数在下,记住结果一定是负的,小数-大数(余数-除数),那么就是M-K
注:此规律的前提是除的结果一定是向下取整,如果你用java去套这个规律会发现完全行不通。
-
常用的模运算
2019-09-23 09:39:09模运算 对于正整数和整数 , ,定义如下运算: 取模运算:a % p(或a mod p),表示a除以p的余数。 模p加法:(a + b) % p ,其结果是a+b算术和除以p的余数,也就是说,(a+b) = kp +r,则(a + b) % p = r。 模p减法:... -
【数字图像处理】第3章:图像基本运算 —— 03 邻域 & 模板运算
2022-05-05 22:49:56数字图像处理——图像基本运算——邻域概念 & 模板运算 1、邻点及邻域 点运算是对图像中每个像素点进行运算,其他点的值不会影响到该像素点,如图像的几何变换、灰度级变换等; 简单结说:相邻像素构成邻域,... -
模运算(带例题详解)
2020-12-06 12:12:01模运算 基本规则 模运算的基本规则与四则运算基本一致: (a + b) % p = (a % p + b % p) % p (a – b) % p = (a % p – b % p) % p (a * b) % p = (a % p * b % p) % p (a^b) % p = ((a % p)^b) % p 这里... -
模运算 详解
2019-10-28 20:30:34模运算 模运算是大数运算中的常用操作。如果一个数太大,无法直接输出,或者不需要直接输出,可以把它取模后缩小数值在输出。 定义模运算为 a 除以 m 的余数,记为: a mod m = a % m 取模的结果满足 0 <= a mod ... -
求模运算(mod)
2021-11-20 18:57:30求模运算: 同余式:正整数a,b对p取模,它们的余数相同,记做 或者a ≡ b (mod p)。 n % p 得到结果的正负由被除数n决定,与p无关。 例如:7%4 = 3, -7%4 = -3, 7%-4 = 3, -7%-4 =-3。 运算规则 (a + b) % ... -
C++模运算
2021-08-22 10:15:23定义“取模”运算:对于正整数 a 和 p,a % p 表示 a 除以 p 的余数,又称“模”运算。现在,输入三个正整数 b、p、k,请编程计算 b^p % k 的值。 输入格式 一行三个正整数,分别表示 b、p、k 的值。 输出格式 一行... -
使用优化的 CIOS算法的模运算处理器 (2004年)
2021-05-10 12:43:00为以较小的面积代价实现 RSA公钥密码算法及其他一些算法所需的求模、模加、模乘、模幂等运算,该文设计了一种可作为协处理器使用的模运算处理器。运算数据的长度可变,范围从 256b到 2048b。采用优化的 CIOS ... -
模运算及其性质
2020-01-12 23:26:10本文以c++语言为载体,对基本的模运算应用进行了分析和程序设计,以理论和实际相结合的方法向大家介绍模运算的基本应用。。 原文:https://blog.csdn.net/cckit/article/details/41629263 基本理论 一、基本概念... -
模运算与取余运算的区别
2020-12-08 12:57:45模运算与求余 首先,“模运算”与“求余运算”都是求取除法中产生的“余数”。比如 “7÷3”产生的余数就是1,所以无论对7和3采用“模运算”还是“求余运算”,得到的结果都是 1 。这也就是为什么我们在学习程序设计... -
离散 模运算
2019-08-31 20:05:58模n加法 两数进行普通加法后,对和进行取余,模n乘法 两数进行普通乘法后,对积进行取余,, ▫ > ▫是模n加法 G={0,1,2,3,4,...,n-1} 模加法有幺元:0,并且每个元素都有逆元;, * > *是模n乘法 G={1,2,3,4,...,n-1}... -
【数论基础】模运算详解及其应用
2020-03-01 12:17:13基本理论 基本概念: 给定一个正整数p,任意一个整数n,一定存在等式 n=kp+rn = kp + rn=kp+r 其中k、rk、rk、r是整数,且 0≤r<p0 ≤ r <...取模运算:a%p(或amodp)a \% p(或a mod p)a... -
易语言大数幂模运算源码-易语言
2021-06-13 06:15:07易语言大数幂模运算源码 -
模运算法则
2018-08-25 20:25:56模运算与基本四则运算有些相似,但是除法例外。其规则如下: (a + b) % p = (a % p + b % p) % p (a - b) % p = (a % p - b % p) % p (a * b) % p = (a % p * b % p) % p (a^b) % p = ((a % p)^b) % p 推论... -
模运算与同余关系
2021-07-16 12:49:11文章目录一、模运算1.通用定义2.关于包含负数的模运算二、同余关系1.定义2.同余类(剩余类)3.完全剩余系 、简化剩余系(既约剩余系/缩系)4.带模运算性质5.同余式性质6.余数之和 一、模运算 1.通用定义 如果a 与d... -
模运算:满足分配率
2021-03-18 19:01:38因此,pow(a,b)%m可以写成: typedef long long LL; LL pow (LL a,LL b,LL m){ LL ans = 1; for (int i = 0;i < b;i++){ ans = ans * a % m; } return ans; } -
简谈密码学中常用的模运算和欧几里得算法
2021-01-04 23:11:53模运算和欧几里得算法Affine Cipher模运算Greatest Common Divisor (GCD) 最大公约数欧几里得的GCD算法Reference Affine Cipher Affine Cipher是基于模运算的一种cipher,其公式为: Y = aX + b mod m Secret key: ... -
【Java】和运算与模运算避免溢出的操作
2021-05-06 17:00:02两个数进行相加操作或者相乘后取模操作,存在溢出的可能。我们需要在计算中避免这样的情况。 下面是两个常用的操作: ...2 模运算避免溢出 // 原语句 (a * b) % m // 更改后的语句 (a % m) * (b % m) % m ... -
模运算的运算法则及逆元的计算
2019-11-03 14:30:21模运算与基本四则运算有些相似,但是除法例外。其规则如下: (a + b) % p = (a % p + b % p) % p (a - b) % p = (a % p - b % p) % p (a * b) % p = (a % p * b % p) % p (a^b) % p = ((a % p)^b) % p 推论: 若a≡b... -
论文研究-基于AES和模运算的密文索引方案.pdf
2019-07-22 19:34:38针对安全密文索引建立问题, 基于AES加密和模运算, 提出了一种循环分区索引方案。该方案的索引由客户端对属性值进行AES加密和模运算得到, 具有部分保序的性质。在有效支持范围查询的同时, 该方案明显降低了等值查询时... -
基于AES和模运算的密文索引方案 (2013年)
2021-05-18 13:26:29针对安全密文索引建立问题, 基于AES加密和模运算, 提出了一种循环分区索引方案。该方案的索引由客户端对属性值进行AES加密和模运算得到, 具有部分保序的性质。在有效支持范围查询的同时, 该方案明显降低了等值查询时... -
A的模P平方根的计算方法和大数的模运算-java
2018-04-07 17:51:35System.out.println("该程序是计算对于A的模P平方根的计算方法,A和P要求用户输入,其中P必须是素数。"); System.out.println("即求解二次同余式:x^2和A模P(x^2=a(mod p))同余式的解,");...以及大数模运算 -
平方乘积法求幂的模运算
2022-03-14 16:58:11这里是用平方-乘积的办法简化模运算