取模运算

来源:互联网 发布:淘宝网禁止出售黄赌毒 编辑:程序博客网 时间:2024/05/29 03:27

在散列表这类的应用中,除留余数法是比较常见的。在使用除留余数法时取模运算是必不可少的,接下来介绍下取模运算:
法则:
1.(a+b)%p=(a%p+b%p)%p
2.(a-b)%p=(a%p-b%p)%p
3.(a*b)%p=((a%p)*(b%p))%p
4.(a^b)%p=((a%p)^b)%p
5.((a+b)%p+c)%p=(a+(b+c)%p)%p
应用场景:
1.判别奇偶数
2.判别素数——用比该数的平方根小的正整数去除这个数
3.求最大公约数——欧几里得辗转相除(gcd(a,b)=gcd(b,(a)mod(b)))
4.求幂运算——例如想知道一个较大的数—a的b次幂的最后一位是多少
5.密码学应用
其中4的应用较为有意思,可以将时间复杂度限定在O(b^1/2)b表示指数,示例demo如下:

//x为底数,n为指数,p为模数//思路:n为偶数时x^n=(x*x)^[n/2] //      n为奇数时 x^n=x*(x*x)^[n/2]#include <stdio.h>unsigned int PowerMod(unsigned int x,unsigned int n,unsigned int p);int main(){    printf("result:%d",PowerMod(3333,77777,10));    return 0;} unsigned int PowerMod(unsigned int x,unsigned int n,unsigned int p){   if(n==0)   {    return 1;   }   unsigned int temp1=(x*x)%p;   unsigned int temp=PowerMod(temp1,n/2,p);//递归的原因是由于n为奇数导致。    if((n&1)!=0)//n为奇数 ,将式子展开后,奇数时多出这一步    temp=(temp*(x%p))%p;   return temp;}

按照这种方式可以极大地降低时间复杂度(=^ ^=)

1 0
原创粉丝点击