同余定理

数论——同余

半世苍凉 提交于 2020-02-23 03:41:53
理论背景 数学上,两个整数除以同一个整数,若得相同余数,则二整数同余(英文:Modular arithmetic,德文:Kongruenz)。同余理论常被用于数论中。最先引用同余的概念与符号者为德国数学家高斯。同余理论是初等数论的重要组成部分,是研究整数问题的重要工具之一,利用同余来论证某些整除性的问题是很简单的。同余是数学竞赛的重要组成部分。 同余定理 给定一个正整数 m,如果两个整数 a 和 b 满足 m|(a-b),即 a-b 能够被 m 整除,或者 (a-b)/m 得到一个整数,那么就称整数 a 与 b 对模 m 同余,记作 a≡b(mod m)。对模 m 同余是整数的一个等价关系。例如:26≡2(mod 12)。 显然,有如下事实: (1)若 a≡0(mod m),则 m|a; (2)a≡b(mod m) 等价于 a 与 b 分别用 m 去除,余数相同。 证明 充分性:m|(a-b) → a≡b(mod m) 设 a=mq1+r1,b=mq2+r2,且 0≤r1, r2<m。 ∵ m |(a-b),又 a-b=m(q1-q2)+(r1-r2)。 ∴必有常数 n 使得 (r1-r2)=mn。 则有 m|(r1-r2)。 ∵0≤r1, r2<m, ∴0≤|r1-r2|<m, ∴r1-r2=0, 即 r1=r2,故 a≡b(mod m)。 必要性:a≡b(mod m) → m

模线性同余方程组求解

喜你入骨 提交于 2020-02-16 16:22:42
问题:模线性同余方程组:   x = a1 ( mod n1 )   x = a2 ( mod n2 )     ....   x = ak ( mod nk ) 给定 A ( a1, a2 , ... , ak ) , N ( n1, n2, ..., nk ) 求 X 。 通常分为两种   一, ( Ni, Nj ) 之间两两互质   二, ( Ni, Nj ) 之间不都互质 一 ( Ni, Nj ) 之间两两互质   定理( 见算法导论 P874 ):   如果 n1, n2 , ... , nk 两两互质, n = n1*n2*..*nk ,则对任意整数 a1,a2,a3..,ak , 方程组     x = ai ( mod ni )   关于未知量 x 对 模n 有唯一解 从输入 ( a1, a2, ... , ak ) 计算出 a :          定义     定义 可以得到:        代码模板   a = a[i] ( mod n[i] ) ( i = 0. 1. 2. .. k ) { n[i] 之间两两互质 } View Code #include<stdio.h> #include<string.h> #include<stdlib.h> #include<iostream> #include<algorithm> using namespace

原码, 反码, 补码 详解

回眸只為那壹抹淺笑 提交于 2020-02-14 19:13:41
原文地址: https://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html 一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1、机器数 一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1. 比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是00000011。如果是 -3 ,就是 10000011 。 那么,这里的 00000011 和 10000011 就是机器数。 2、真值 因为第一位是符号位,所以机器数的形式值就不等于真正的数值。例如上面的有符号数 10000011,其最高位1代表负,其真正数值是 -3 而不是形式值131(10000011转换成十进制等于131)。所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。 例:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1 二. 原码, 反码, 补码的基础概念和计算方法. 在探求为何机器要使用补码之前, 让我们先了解原码, 反码和补码的概念.对于一个数, 计算机要使用一定的编码方式进行存储. 原码, 反码,

原码、补码、反码

我只是一个虾纸丫 提交于 2020-02-13 10:51:25
本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1、机器数 一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1. 比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是00000011。如果是 -3 ,就是 10000011 。 那么,这里的 00000011 和 10000011 就是机器数。 2、真值 因为第一位是符号位,所以机器数的形式值就不等于真正的数值。例如上面的有符号数 10000011,其最高位1代表负,其真正数值是 -3 而不是形式值131(10000011转换成十进制等于131)。所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。 例:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1 二. 原码, 反码, 补码的基础概念和计算方法. 在探求为何机器要使用补码之前, 让我们先了解原码, 反码和补码的概念.对于一个数, 计算机要使用一定的编码方式进行存储. 原码, 反码, 补码是机器存储一个具体数字的编码方式

原码、反码、补码知识详细讲解(转)

巧了我就是萌 提交于 2020-02-13 10:50:13
本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希望本文对大家学习计算机基础有所帮助! 一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1、机器数 一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1. 比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是00000011。如果是 -3 ,就是 10000011 。 那么,这里的 00000011 和 10000011 就是机器数。 2、真值 因为第一位是符号位,所以机器数的形式值就不等于真正的数值。例如上面的有符号数 10000011,其最高位1代表负,其真正数值是 -3 而不是形式值131(10000011转换成十进制等于131)。所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。 例:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1 二. 原码, 反码, 补码的基础概念和计算方法. 在探求为何机器要使用补码之前, 让我们先了解原码, 反码和补码的概念.对于一个数,

原码 & 反码 & 补码 & 详解

徘徊边缘 提交于 2020-02-13 09:43:08
本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希望本文对大家学习计算机基础有所帮助! 一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1、机器数 一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1. 比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是00000011。如果是 -3 ,就是 10000011 。 那么,这里的 00000011 和 10000011 就是机器数。 2、真值 因 为第一位是符号位,所以机器数的形式值就不等于真正的数值。例如上面的有符号数 10000011,其最高位1代表负,其真正数值是 -3 而不是形式值131(10000011转换成十进制等于131)。所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。 例:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1 二. 原码, 反码, 补码的基础概念和计算方法. 在探求为何机器要使用补码之前, 让我们先了解原码, 反码和补码的概念.对于一个数,

原码, 反码, 补码 详解

落爺英雄遲暮 提交于 2020-02-13 09:42:46
一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1、机器数 一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1. 比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是00000011。如果是 -3 ,就是 10000011 。 那么,这里的 00000011 和 10000011 就是机器数。 2、真值 因 为第一位是符号位,所以机器数的形式值就不等于真正的数值。例如上面的有符号数 10000011,其最高位1代表负,其真正数值是 -3 而不是形式值131(10000011转换成十进制等于131)。所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。 例:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1 二. 原码, 反码, 补码的基础概念和计算方法. 在探求为何机器要使用补码之前, 让我们先了解原码, 反码和补码的概念.对于一个数, 计算机要使用一定的编码方式进行存储. 原码, 反码, 补码是机器存储一个具体数字的编码方式. 1. 原码 原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制: [+1] 原 = 0000 0001 [

原码,补码和反码

馋奶兔 提交于 2020-02-13 09:39:29
一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1、机器数 一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1. 比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是00000011。如果是 -3 ,就是 10000011 。 那么,这里的 00000011 和 10000011 就是机器数。 2、真值 因为第一位是符号位,所以机器数的形式值就不等于真正的数值。例如上面的有符号数 10000011,其最高位1代表负,其真正数值是 -3 而不是形式值131(10000011转换成十进制等于131)。 所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。例:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1 二. 原码, 反码, 补码的基础概念和计算方法. 在探求为何机器要使用补码之前, 让我们先了解原码, 反码和补码的概念.对于一个数, 计算机要使用一定的编码方式进行存储. 原码, 反码, 补码是机器存储一个具体数字的编码方式. 1. 原码 原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制: [+1]原 = 0000 0001 [-1

同余方程详解

匆匆过客 提交于 2020-02-07 00:07:40
同余概述 定义: 同余给定正整数 m m m ,若用 m m m 去除两个整数 a a a 和 b b b ,所得的余数相同,称a和b对模 m m m 同余,记作 a ≡ b ( m o d m ) a≡b(mod\ m) a ≡ b ( m o d m ) ,并称该式为同余式,否则,称 a a a 和 b b b 对模 m m m 不同余。 定理: a ≡ b ( m o d m ) a≡b(mod\ m) a ≡ b ( m o d m ) ,当且仅当 m ∣ ( a − b ) m|(a-b) m ∣ ( a − b ) a ≡ b ( m o d m ) a≡b(mod\ m) a ≡ b ( m o d m ) ,当且仅当存在正整数 k k k ,使得 a = b + k m a=b+km a = b + k m 同余关系是等价关系,即 (1)自反性: a ≡ a ( m o d m ) a≡a(mod\ m) a ≡ a ( m o d m ) (2)对称性: a ≡ b ( m o d m ) a≡b(mod\ m) a ≡ b ( m o d m ) ,则 b ≡ a ( m o d m ) b≡a(mod\ m) b ≡ a ( m o d m ) (3)传递性: a ≡ b ( m o d m ) , b ≡ c ( m o d m ) a≡b(mod\ m)

(扩展)BSGS与高次同余方程

不打扰是莪最后的温柔 提交于 2020-01-30 07:05:46
前言: 今天更BSGS算法。俗称大步小步算法(Big-Step G…-Step),又称拔山盖世、北上广深、 白色狗屎 。 问题: 求解指数同余方程: a x ≡ b ( m o d    p ) a^{x}\equiv b(mod\; p) a x ≡ b ( m o d p ) 的最小自然数解。 BSGS算法: 模板题 这个算法只考虑 g c d ( a , p ) = 1 gcd(a,p)=1 g c d ( a , p ) = 1 的情况。 那么,怎么做呢。 其实做法很简单,就是 枚举 。 先来一种 暴力枚举 。 就是枚举 x x x 从 [ 0 , p − 1 ] [0,p-1] [ 0 , p − 1 ] ,然后检验答案是否正确。 知道欧拉定理的应该知道只要枚举到 φ ( p ) − 1 \varphi(p)-1 φ ( p ) − 1 ,但 p p p 为质数时欧拉函数仍为 p − 1 p-1 p − 1 。 看过 阶与原根 的应该知道只要枚举到 p p p 的阶即可,但算 p p p 的阶仍然要暴力去枚举。 所以这里只要一个一个枚举过去便好。 但是 o ( p ) o(p) o ( p ) 的暴力枚举配不上这么高大上的名字,所以还有优化的余地。 我们可以考虑 折半枚举 。 怎么折半,就是这个算法的精髓了。 我们令 x = k n + i x=kn+i x = k n