<<什么是数学>> 余数那些事儿

<<什么是数学>> 笔记 余数那些事儿

今天又踩坑了,感觉各种问题递归下去有没个尽头的样子╮(╯_╰)╭

还是要回归到数学的本质上来...

只要说数学,你就会被高斯帅哭的...

一般性的概念.

只要碰到用一个固定的整数d,去除整数的问题,"同余"的概念和记法(高斯创造)使得这个推理简单而清楚.

(伟大的人都是把复杂的问题简单化)

啊哈, 看图,"同余"的概念就很直观了.我们看到任意一个整数被5除时,剩下的余数是0,1,2,3,4,这五个数中的一个.如果两个整数a和b被5除有相同的余数,我们称它们是模5同余

同余数的表示方法,这就是同余式

一下命题等价:

1. a和b是模5同余.

2. 存在某个整数n, a = b + nd;

3.   d 整除 a - b

一开始我很狐疑(我智商低求不鄙视..),为嘛 a = b + nd 会成立,如果a ,b 同余的话.

好,我们来证明一下

对于命题"如果 a,b 同余,那么 a = b + nd" 的证明:

假设a ,b 同余的话,可以假设它们对于模d的共同余数为为r.

那么有a = r + x*d;

b = r + y*d;

两个等式做减法. a - b = (x - y) * d; 变形 a = b + (x- y)*d.看,是不是如果用n表示 x - y 就能得到命题的证明了!

高斯的这种同余数表示方法之所以很方便,是因为它表示的同余式满足很多基础性的运算符法则,加,减,乘

这里的 加 减 乘 是针对 两对同余数(即同余式)来说的,而不是一对同余数 (不是天才就慢慢的思考嘛~,会有更深刻的认识)

证明一下:

已知, a == a‘ (mod d) , b == b‘(mod d)

a   = r + d*x;

a‘  = r + d*y;

b  = p + d*m;

b‘ = p + d*n;

由于:

a + b = (r + p) + d*(x + m)

a‘ + b‘ = (r + p) + d*(y + n)

那么我们可以知道,a+b与a‘+b‘同余!

同理可以证明 5) 和 6)

大名鼎鼎的GCD算法的证明:

下面是我以前写的关于GCD的实现

http://blog.csdn.net/cinmyheart/article/details/39370553

证明过程简直beautiful,有木有! 超帅~

我今天终于明白...GCD为什么那样写了...

一条很重要的规律: 当a或b任意一个素数d的倍数时,那么他们的乘积也是d的倍数.这里重点其实在强调d必须是素数.

当d不是个素数的时候, 上述约束就不一定成立.

费马定理:

注意!p是个素数, 而且还是不能整除a的素数.

2^2 = 1 (mod 3)

2^4 = 1 (mod 5)

这样应该比较有感觉.

费马定理的证明:

证明过程中对于"m1 m2 m3 ... mp-1 如果将其次序重新排序,必须相应的同余于数1 2 3 4 ... p-1"这里不明白, 如果有人知道为嘛的话, 希望能一起交流讨论~

后面其他余数相关的东东应该还会update~

时间: 2024-10-20 00:24:35

<<什么是数学>> 余数那些事儿的相关文章

内置CRC于hex程序中的方法

[摘要] 为了让MCU程序显示自身的CRC值,需要将其内置到程序中.但是,通常情况下,用计算好的CRC值,代替程序中原有的默认值之后,会导致程序发生变动,进而引发CRC值的变动.最终,新程序显示的值,是旧程序的CRC值. 1.问题原因分析 首先要说明一下,为什么要内置CRC值到程序中. 把程序分成两个hex文件,一个是普通的程序,另一个单独使用Flash的一页,并将CRC值放置在其中,每次下载两个hex文件,不行吗?这方法本身是可行的,但是,为了显示CRC值,而使用Flash的一页,太浪费了.而

java se的那些细节

局部变量:方法体内或语句块内,不能有修饰符 成员变量:与类的对象共存,可以有修饰符 类属性:与类共存,可以有修饰符 一.局部变量:必须先赋值,才能使用,如果不赋初值,则会报错,即没有默认的始使值,而基本数据类型的类属性或成员变量则不会,他们通过编译以后被赋与默认值. 程序1: public class Test{    public static void main(String[] args){        float f;        System.out.println(f);   

51nod三大经典博弈(模板)

真是令人惊讶,三大经典博弈都可以通过数学运算得到结论简单解决! Bash游戏(数学余数方法) 关键:必输局面,谁面对(k+1)个石子这个局面必输! 1 #include <iostream> 2 using namespace std; 3 4 int main() 5 { 6 int T; 7 cin>>T; 8 while(T--) 9 { 10 int n,k; 11 cin>>n>>k; 12 13 if(n%(k+1)) cout<<'

51nod 1225 余数的和 数学

1225 余数之和 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题  收藏  关注 F(n) = (n % 1) + (n % 2) + (n % 3) + ...... (n % n).其中%表示Mod,也就是余数. 例如F(6) = 6 % 1 + 6 % 2 + 6 % 3 + 6 % 4 + 6 % 5 + 6 % 6 = 0 + 0 + 0 + 2 + 1 + 0 = 3. 给出n,计算F(n), 由于结果很大,输出Mod 1000000007的结果

【BZOJ-4173】数学 欧拉函数 + 关于余数的变换

4173: 数学 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 306  Solved: 163[Submit][Status][Discuss] Description Input 输入文件的第一行输入两个正整数 . Output 如题 Sample Input 5 6 Sample Output 240 HINT N,M<=10^15 Source Solution 数论好题,开始无从下手,推导后感觉新姿势++ 题目大意:求$\varphi(

bzoj 1257: [CQOI2007]余数之和sum 数学 &amp;&amp; 枚举

1257: [CQOI2007]余数之和sum Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 1779  Solved: 823[Submit][Status] Description 给出正整数n和k,计算j(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值,其中k mod i表示k除以i的余数.例如j(5, 3)=3 mod 1 + 3 mod 2 + 3 mod 3 + 3 mod 4 + 3

bzoj 1257 : [CQOI2007]余数之和 (数学+分块)

Description 给出正整数n和k,计算j(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值 其中k mod i表示k除以i的余数. 例如j(5, 3)=3 mod 1 + 3 mod 2 + 3 mod 3 + 3 mod 4 + 3 mod 5=0+1+0+3+3=7 Input 输入仅一行,包含两个整数n, k. 1<=n ,k<=10^9 Output 输出仅一行,即j(n, k). Sample Input 5 3 Sample

[BZOJ 1257] [CQOI2007] 余数之和sum 【数学】

题目链接:BZOJ - 1257 题目分析 首先, a % b = a - (a/b) * b,那么答案就是 sigma(k % i) = n * k - sigma(k / i) * i     (1 <= i <= n) 前面的 n * k 很容易算,那么后面的 sigma(k / i) * i,怎么办呢? 我们可以分情况讨论,就有一个 O(sqrtk) 的做法. 1)当 i < sqrtk 时,直接枚举算这一部分. 2)当 i >= sqrtk 时, k / i <=

BZOJ_1257_ [CQOI2007]余数之和sum_数学

题意:给出正整数n和k,计算j(n, k)=k mod 1 + k mod 2 + k mod 3 + - + k mod n的值. 分析:把k mod n搞成k - k/n*n; 答案就是(k+1)*k/2减去后面那坨. k/i*i 发现每段相等的k/i乘了一个等差数列. 完了. 代码: 1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 using namespace std; 5