一.基本理论

a%b=a−b∗⌊ab⌋a \% b = a-b*\lfloor\frac{a}{b}\rfloora%b=a−b∗⌊ba​⌋

1.基本概念:

给定一个正整数p,任意一个整数n,一定存在等式 n=kp+rn = kp + rn=kp+r
  
其中k、rk、rk、r是整数,且 0≤r<p0 ≤ r < p0≤r<p,称呼kkk为nnn除以ppp的商,rrr为nnn除以p的余数。

对于正整数p和整数a,ba,ba,b,定义如下运算:

取模运算:a%pa \% pa%p (或amodpa mod pamodp),表示a除以p的余数。

模p加法:(a+b)%p(a + b) \% p(a+b)%p ,其结果是a+ba+ba+b算术和除以p的余数,也就是说,(a+b)=kp+r,(a+b) = kp +r,(a+b)=kp+r,则(a+b)%p=r。(a + b) \% p = r。(a+b)%p=r。

模p减法:(a−b)%p(a-b) \% p(a−b)%p,其结果是a−ba-ba−b算术差除以p的余数。

模p乘法:(a∗b)%p(a * b) \% p(a∗b)%p,其结果是a∗ba*ba∗b算术乘法除以p的余数。

2.说明:

1. 同余式:正整数a,ba,ba,b 分别对 ppp 取模,它们的余数相同,记做 a≡b%pa ≡ b \% pa≡b%p或者a≡b(modp)。a ≡ b (mod p)。a≡b(modp)。

2.n%pn \% pn%p得到结果的正负由被除数n决定,与p无关。例如:7%4=37\%4 = 37%4=3, −7%4=−3,7%−4=3,−7%−4=−3-7\%4 = -3, 7\%-4 = 3, -7\%-4 = -3−7%4=−3,7%−4=3,−7%−4=−3。

3.基本性质

(1)若p∣(a−b),p|(a-b),p∣(a−b),则a≡b(%p)a≡b (\% p)a≡b(%p)。例如 11≡4(%7),11 ≡ 4 (\% 7),11≡4(%7), 18≡4(%7)18 ≡ 4(\% 7)18≡4(%7)

(2)(a%p)=(b%p)(a \% p)=(b \% p)(a%p)=(b%p)意味a≡b(%p)a≡b (\% p)a≡b(%p)

(3)对称性:a≡b(%p)a≡b (\% p)a≡b(%p)等价于b≡a(%p)b≡a (\% p)b≡a(%p)

(4)传递性:若a≡b(%p)a≡b (\% p)a≡b(%p)且b≡c(%p)b≡c (\% p)b≡c(%p),则a≡c(%p)a≡c (\% p)a≡c(%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 (1)

(a−b)%p=(a%p−b%p)%p(a - b) \% p = (a \% p - b \% p) \% p(a−b)%p=(a%p−b%p)%p (2)

(a∗b)%p=(a%p∗b%p)%p(a * b) \% p = (a \% p * b \% p) \% p(a∗b)%p=(a%p∗b%p)%p (3)

(ab)%p=((a%p)b)%p(a^b) \% p = ((a \% p)^b) \% p(ab)%p=((a%p)b)%p (4)

结合率: ((a+b)%p+c)%p=(a+(b+c)%p)%p((a+b) \% p + c) \% p = (a + (b+c) \% p) \% p((a+b)%p+c)%p=(a+(b+c)%p)%p(5)

((a∗b)%p∗c)%p=(a∗(b∗c)%p)%p((a*b) \% p * c)\% p = (a * (b*c) \% p) \% p((a∗b)%p∗c)%p=(a∗(b∗c)%p)%p (6)

交换率: (a+b)%p=(b+a)%p(a + b) \% p = (b+a) \% p(a+b)%p=(b+a)%p (7)

(a∗b)%p=(b∗a)%p(a * b) \% p = (b * a) \% p(a∗b)%p=(b∗a)%p (8)

分配率: ((a+b)%p∗c)%p=((a∗c)%p+(b∗c)%p)%p((a +b)\% p * c) \% p = ((a * c) \% p + (b * c) \% p) \% p((a+b)%p∗c)%p=((a∗c)%p+(b∗c)%p)%p (9)

重要定理:若a≡b(%p),a≡b (\% p),a≡b(%p),则对于任意的ccc,都有(a+c)≡(b+c)(%p)(a + c) ≡ (b + c) (\%p)(a+c)≡(b+c)(%p);(10)

若a≡b(%p)a≡b (\% p)a≡b(%p),则对于任意的ccc,都有(a∗c)≡(b∗c)(%p)(a * c) ≡ (b * c) (\%p)(a∗c)≡(b∗c)(%p);(11)

若a≡b(%p)a≡b (\% p)a≡b(%p),c≡d(%p)c≡d (\% p)c≡d(%p),则 (a+c)≡(b+d)(%p)(a + c) ≡ (b + d) (\%p)(a+c)≡(b+d)(%p),(a−c)≡(b−d)((a - c) ≡ (b - d) (%p)(a−c)≡(b−d)(,

(a∗c)≡(b∗d)(%p)(a * c) ≡ (b * d) (\%p)(a∗c)≡(b∗d)(%p),(a/c)≡(b/d)(%p)(a / c) ≡ (b / d) (\%p)(a/c)≡(b/d)(%p); (12)

若a≡b(%p)a≡b (\% p)a≡b(%p),则对于任意的ccc,都有ac≡bc(%p)ac≡ bc (\%p)ac≡bc(%p); (13)

二.基本应用

1.判别奇偶数  2.判别素数3. 最大公约数  4.模幂运算

1.快速幂运算

UVA10006 Carmichael Numbers

一个数是CarmichaelNumbersCarmichael NumbersCarmichaelNumbers
得满足它不是质数并且对于每一个i(1<i<n)i (1 < i < n)i(1<i<n)都满足in≡imodni ^ n \equiv i \mod nin≡imodn
我们如果暴力求解ini ^ nin
时间复杂度是O(n)O(n)O(n)妥妥的TLETLETLE
我们引进一个高效求xyx ^ yxy 的东西:
快速幂
什么是快速幂呢,就是把 xyx ^ yxy
变为
(1) ymod2=0:xy=(x2)y/2y \mod 2 = 0 : x ^ y = (x ^ 2) ^ {y / 2}ymod2=0:xy=(x2)y/2(

(2) ymod2=1:xy=x∗xy−1y \mod 2 = 1 : x ^ y = x * x ^ {y - 1}ymod2=1:xy=x∗xy−1 ,此时y为偶数

因为每次 yyy 都会除以2
所以快速幂的时间复杂度就为O(log2y)O(log_2y)O(log2​y)
那么此题的时间复杂度就为O(T∗(n+n∗log2n))O(T * (\sqrt{n} + n * log_2n))O(T∗(n​+n∗log2​n))

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ifstream in("input.txt");
ofstream out("output.txt");
#define debug(x) cout<<"# "<<x<<endl
const ll N=100005;
const ll base=137;
const ll mod=2147483647;
const ll INF=1<<30;
ll n,m,x;
ll mod_pos(ll x,ll n,ll mod)
{ll res=1;while(n){if(n&1)res=res*x%mod;x=x*x%mod;n>>=1;}return res;
}
int main()
{while(~scanf("%lld",&n)&&n!=0){bool flag=true;for(int i=2;i*i<=n;++i){if(n%i==0)flag=false;}if(flag){printf("%lld is normal.\n",n);continue;}flag=true;for(int i=2;i<n;++i){if(mod_pos(i,n,n)!=i){flag=false;printf("%lld is normal.\n",n);break;}}if(flag)printf("The number %lld is a Carmichael number.\n",n);}return 0;
}

【数论基础】模运算详解及其应用相关推荐

  1. 取模(余)%运算详解

    取模(余)%运算详解 1.JAVA中 对于整型数a,b来说,取模运算是:               1.求 整数商: c = a/b;               2.计算模: a%b = a - ...

  2. 位运算详解+竞赛常见用法总结

    目录 一.位运算详解 二.位运算应用 1.快速幂 2.给定一个数组A, 长度为n,求下面这段程序的值 3.数数字 4.数数字 2 5.nim博弈问题: 6.树状数组 7.判断一个数x是不是2的某次方 ...

  3. python开方运算符_Pytorch Tensor基本数学运算详解

    1. 加法运算 示例代码: import torch # 这两个Tensor加减乘除会对b自动进行Broadcasting a = torch.rand(3, 4) b = torch.rand(4) ...

  4. Redis基础及原理详解

    Redis基础及原理详解 前言:以下是最近学习redis的一些笔记总结,文中如有不当的地方欢迎批评指正,重在记录与学习,笔芯~~ Nosql概述 演进历史 单机mysql Memcached(缓存)+ ...

  5. C语言基础之操作符详解

    C语言基础之操作符详解 操作符的分类 算术操作符 移位操作符 位操作符 逻辑操作符 逗号表达式 表达式求值 隐式类型转换 算术转换 操作符的属性 xwg今天就带各位大佬来了解一波C语言的操作符. 操作 ...

  6. (转)C语言位运算详解

    地址:http://www.cnblogs.com/911/archive/2008/05/20/1203477.html C语言位运算详解 作者:911 说明:本文参考了http://www2.ts ...

  7. 基础排序算法详解与优化

    文章图片存储在GitHub,网速不佳的朋友,请看<基础排序算法详解与优化> 或者 来我的技术小站 godbmw.com 1. 谈谈基础排序 常见的基础排序有选择排序.冒泡排序和插入排序.众 ...

  8. 基础拾遗------委托详解

    基础拾遗: 基础拾遗------特性详解 基础拾遗------webservice详解 基础拾遗------redis详解 基础拾遗------反射详解 基础拾遗------委托详解 基础拾遗---- ...

  9. [系统安全] 四十四.APT系列(9)Metasploit技术之基础用法万字详解及防御机理

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

最新文章

  1. javascript ES6
  2. accept系统调用内核实现
  3. servlet中的几个路径有关的方法
  4. mysql insert报错_mysql数据库使用insert语句插入中文数据报错
  5. 2020-09-26
  6. 大数据技术原理与应用-概述
  7. 浏览器从输入URL到页面渲染过程 ——页面渲染流程
  8. tickcount()修改成小时分钟_银行核心系统24小时机制实现总结
  9. python鼠标移动事件_给turtle屏幕增加鼠标移动事件核心代码
  10. HTML textarea控件
  11. Java-Runoob-高级教程-实例-方法:11. Java 实例 – enum 和 switch 语句使用
  12. java 日期加一天_漫话:如何给女朋友解释为什么一到年底,部分网站就会出现日期混乱的现象?...
  13. work summary(1)
  14. Facebook 开源 React Native - iOS移动开发周报
  15. 7. 如何创建 CSS
  16. 试炼之石:Performance
  17. java数组名加括号_数组作参数被使用时,数组名后必须加方括号
  18. linux的通配符有哪些,Linux通配符
  19. KMeans算法流程
  20. 音频处理——音频编码原理简介

热门文章

  1. Leetcode (396 旋转函数)
  2. P2055 [ZJOI2009]假期的宿舍
  3. 各种图论模型及其解答(转)
  4. 标准化是RFID发展的必由之路
  5. response的contentType 常见几种类型
  6. 诚信,聪明,快乐,地位与竞争
  7. gif 图片制作和拆解
  8. 将sqlite查询结果导入到文本文件
  9. 奔图打印机显示未连接_手机连接奔图打印机,无法打印的解决方法
  10. java 月份起止时间_java已知时间的本周,本月,本年的起始时间