模运算

数字类型的操作

£可爱£侵袭症+ 提交于 2019-11-30 18:30:14
一、内置数值运算操作符 Python提供了9个基本的数值运算操作符,如表3.2所示。这些操作符由python解释器直接提供,不需要引用标准或第三方函数库,也叫内置操作符。 1.x+y x与y之和 2.x-y x与y之差 3.x*y x与y之积 4.x/y x与y之商 5.x//y x与y之整数商,即不大于x与y之商的最大整数 6.x%y x与y之商的余数,也称模运算 7.-x x的负值,即x(-1)* 8.+x x的本身 9.x**y x的y次幂,即x^y 这9个操作数与数学 习惯一致,运算结果也符合数学意义。操作运算的结果可能改变数字类型,三种数字类型之间存在一种逐渐扩展的关系,具体如下: 整数>浮点数>复数 二、内置数值运算函数 python解释器提供了一些内置函数,在这些内置函数之中,有6个函数与数值运算相关,如下所示 abs(x) x的绝对值 divmod(x,y) (x//y,x%y),输出为二元组形式(也称元组内型) pow(x,y[,z]) (x**y)%z,[....]表示该参数可以省略,即pow(x,y),它与x**y相同 round(x,[,ndigits]) 对x四舍五入,保留ndigits位小数。round(x)返回四舍五入的整数值 max(x1,x2,,,,xn) x1,x2...xn的最大值,n没有限定 min(x1,x2,,,,,xn) x1,x2..

浅谈密码学中数论基础

三世轮回 提交于 2019-11-30 06:40:38
1.模运算(mod) 模运算也可以称为取余运算,例如 23≡11(mod12),因此如果a=kn+b,也可以表示为a ≡ b(mod n),运算规则: (a+b) mod n = ((a mod n) + (b mod n))mod n (a*b) mod n = ((a mod n) * (b mod n)) mod n 完全剩余集合 1~n-1构成了自然数n的完全剩余集合,对于任意一个整数m%n都存在于1~n的集合中 。 构造加法链 在加密算法中,运用到了大量的取模运算,对于一个k位数模n,所有的运算例如加减乘除中间结构将不会超过2k位,因此例如a x mod n将会大大简化计算时的复杂度。 例如a 8 mod n 在计算时可以这样计算 ((a 2 mod n) 2 mod n) 2 mod n 当指数x不是2的倍数时则需要构造加法链,例如25,25 = 16 + 8 +1 = 2 4 + 2 3 + 2 0 因此a 25 mod n = (a * a 8 * a 16 ) mod n = ((((a 2 * a) 2 ) 2 ) 2 *a)mod n C语言表示 unsigned long ss(unsigned long x , unsigned long y , unsigned long n) { unsigned long s,t,u; int i ; s = 1;

C++负数类型转换,-1对256取模

戏子无情 提交于 2019-11-30 00:54:42
最近在读C++ primer的时候,发现p32上写道:当我们赋给无符号类型一个超出它表示范围的值时,结果是初始值对无符号类型表示数值总数取模后的余数。因此,把-1赋值给8比特大小的unsigned char所得的结果是255。 -1怎么取模? 这里先明确一下取模和取余的区别:(百度百科) 取模运算(“Module Operation”)和取余运算(“Complementation ”)两个概念有重叠的部分但又不完全一致。主要的区别在于对负整数进行除法运算时操作不同。取模主要是用于计算机术语中。取余则更多是数学概念。模运算在数论和程序设计中都有着广泛的应用。 对于整型数a,b来说,取模运算或者求余运算的方法都是: 1.求 整数商: c = a/b; 2.计算模或者余数: r = a - c b. 求模运算和求余运算在第一步不同: 取余运算在取c的值时,向0 方向舍入(fix()函数);而取模运算在计算c的值时,向负无穷方向舍入(floor()函数)。 例如计算:-7 Mod 4 那么:a = -7;b = 4; 第一步:求整数商c,如进行求模运算c = -2(向负无穷方向舍入),求余c = -1(向0方向舍入); 第二步:计算模和余数的公式相同,但因c的值不同,求模时r = 1,求余时r = -3。 归纳:当a和b符号一致时,求模运算和求余运算所得的c的值一致,因此结果一致。

【数据结构】8.java源码关于HashMap

℡╲_俬逩灬. 提交于 2019-11-28 06:03:00
1.hashmap的底层数据结构 众所皆知map的底层结构是类似邻接表的结构,但是进入1.8之后,链表模式再一定情况下又会转换为红黑树 在JDK8中,当链表长度达到8,并且hash桶容量超过64(MIN_TREEIFY_CAPACITY),会转化成红黑树,以提升它的查询、插入效率底层哈希桶的数据结构是数组,所以也会涉及到扩容的问题。 当MyHashMap的容量达到threshold域值时,就会触发扩容。扩容前后,哈希桶的长度一定会是2的次方。 1.1 为什么用红黑树 那么为什么用红黑树呢?之前都是用的链表,之前的文章有提到链表的随机访问效率是很低的,因为需要从head一个个往后面找,那么时间复杂度就是O(n),但是如果是红黑树因为红黑树是平衡二叉树,说白了就是可以索引的,那么时间复杂度只有O(logn),这样效率就可以得到很大的提高 也许有人就想问了,那为什么还搞个链表啊,直接用红黑树不就完了: 1.链表比红黑树简单,构造一个红黑树要比构造链表复杂多了,所以在链表不多的情况下,整体性能上来看,当链表不长的时候红黑树的性能不一定有链表高 2.还有一个节点的添加和删除的时候,需要对红黑树进行旋转,着色等操作,这个就比链表的操作复杂多了 3.所以为链表设置一个阈值用来界定什么时候进行树化,什么时候维持链表,从中间取得一个均衡是很重要的 1.2 为什么阈值是64,链表长度到8

逆元

大城市里の小女人 提交于 2019-11-26 22:12:29
在分数取模时总会用到逆元运算 在模运算中 (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) %p (错) 对于除法的模运算不适合,所以需要定义一个新的东西来求除法模运算,这个东西就是逆元 定义: (a/b)(mod p)=(a inv[b])(mod p) 或者 a b≡1(mod P)` inv[b]就是b的逆元 a就是b的逆元,或者ab或为逆元 则根据定义可知 除以一个数再取模等同于乘以这个数的逆元再取模 但是我们不能直接说一个数的逆元是多少, 应该这么说: 一个数 x 在模 p 的条件下的逆元是多少 比如2 * 3 % 5 = 1,那么3就是2关于5的逆元,或者说2和3关于5互为逆元 (a*inv[b])%p,inv[b]就是a关于p的逆元 条件:a与p互为质数,a才有关于p的逆元 转换除法模运算 根据取模运算 (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) %p (错) (a /