3.大整数求余数的问题分析
余数知识点总结

余数知识点总结一、余数的定义在进行整数除法时,如果被除数不能被除数整除,我们就会得到一个余数。
例如,当我们用10除以3时,商是3,余数是1,因为10除以3得到3余1。
一般来说,对于任意的整数a和b(b不为0),都存在唯一的整数q和r,使得a=bq+r,其中q是商,r是余数。
二、余数的性质1. 余数的范围余数r的范围是0到b-1。
这是因为如果r=b-1,那么a=bq+r=bq+(b-1)=(q+1)b-1。
所以当r大于等于b时,我们可以用b来替换掉r,而商q则加1。
所以余数r必然小于b。
2. 余数的相等性如果两个整数a和b除以同一个整数m得到相同的余数,那么它们的差也一定能被m整除,即如果a%m=b%m,则(a-b)%m=0。
3. 余数的加法性两个整数a和b的余数之和等于它们的和的余数,即(a+b)%m=(a%m+b%m)%m。
4. 余数的乘法性两个整数a和b的余数之积等于它们的积的余数,即(a*b)%m=(a%m*b%m)%m。
5. 余数的幂运算如果要计算a的n次幂的余数,我们可以先计算a%m的n次幂的余数,然后再对m取余。
即a^n%m=(a%m)^n%m。
6. 余数的倒数两个整数a和b互素,即它们的最大公约数是1,那么a在模b意义下一定有倒数。
即对于方程ax≡1 mod b,一定存在整数x满足条件。
三、余数的应用1. 余数的运算余数在算术运算中有着广泛的应用,可以用于简化复杂的运算。
例如在大数运算中,我们往往会对结果取模,以减小结果的数值大小,提高运算效率。
2. 余数的模运算模运算是指对一个数除以另一个数后得到的余数。
在计算机科学中,模运算常常被用于实现循环、加密和散列等操作。
例如在密码学中,模运算可以用于加解密算法中的步骤之一。
3. 余数的逆元余数的逆元是指在模意义下存在的一个数,使得与它相乘后得到的余数是1。
余数的逆元在密码学和数论中有着重要的应用,例如在RSA算法中,逆元的存在性是保证算法有效性的关键。
找余数的方法

找余数的方法在数学中,我们经常需要求出一个数除以另一个数的余数。
例如,我们想要确定一个数是奇数还是偶数,就需要知道它除以2的余数。
在一些数学问题中,求余数也是必要的。
本文将介绍数学中常见的找余数方法。
1.取模运算取模运算是一种常见的方法,用于计算两个整数相除的余数。
记a、b为两个整数,a÷b = c……r(0≤r<b)即表示a除以b,商为c,余数为r。
则称r为a对b取模运算的结果,并且用符号“a mod b”表示。
例如,7÷3=2……1,7 mod 3 = 1,其中2为商,1为余数。
在C语言中,%(取模)是一个运算符,它返回两个操作数相除的余数,如4%3=1。
它可以用在if语句、循环中,还可以用来判断一个数的奇偶性。
例如:if (num % 2 == 0) { printf("num iseven\n"); } else { printf("num is odd\n"); }2.二进制运算二进制运算也可以用来求一个数对另一个数的余数。
假设a、b都是正整数,则a除以b的余数等于将a转换为二进制表示后,从高位开始先取b比特,然后计算剩余的比特表示的二进制数所对应的十进制数的余数。
例如,以十进制数7除以3的余数为例:7的二进制表示为111,取出前两位得到11,转换为十进制数3。
3除以3的余数为0,因此7除以3的余数为1。
3.循环相减法循环相减法也被称为“短除法”,它是小学时学到的一种方法。
假设要求a除以b的余数,则可以先让a减去b,再让a减去b,直到a小于b时,此时的a就是余数。
例如,11除以3的余数为:11 - 3 = 8 8 - 3 = 5 5 - 3 = 2 2 < 3,所以11除以3的余数为2但是循环相减法效率不高,当a和b较大时,计算量也会变得非常大。
4.同余定理同余定理是一种重要的求余数方法,它常常用于密码和信息论中。
数论之余数问题---学生版

数论之余数问题余数问题是数论知识板块中另一个内容丰富,题目难度较大的知识体系,也是各大杯赛小升初考试必考的奥数知识点,所以学好本讲对于学生来说非常重要。
【知识点拨】1.余数的加法定理①a与b的和除以c的余数,等于a,b分别除以c的余数之和,或这个和除以c的余数。
②当余数的和比除数大时,所求的余数等于余数之和再除以c的余数。
2.余数的乘法定理①a与b的乘积除以c的余数,等于a,b分别除以c的余数的积,或者这个积除以c所得的余数。
②当余数的和比除数大时,所求的余数等于余数之积再除以c的余数。
例题精讲:【模块一:带余除法的定义和性质】【例 1】用某自然数a去除1992,得到商是46,余数是r,求a和r.【巩固】1、 (清华附中小升初分班考试)甲、乙两数的和是1088,甲数除以乙数商11余32,求甲、乙两数.2、一个两位数除310,余数是37,求这样的两位数。
【例 2】(2003年全国小学数学奥林匹克试题)有两个自然数相除,商是17,余数是13,已知被除数、除数、商与余数之和为2113,则被除数是多少?【巩固】用一个自然数去除另一个自然数,商为40,余数是16.被除数、除数、商、余数的和是933,求这2个自然数各是多少?【例 3】三个不同的自然数的和为2001,它们分别除以19,23,31所得的商相同,所得的余数也相同,这三个数是_______,_______,_______。
【巩固】一个自然数,除以11时所得到的商和余数是相等的,除以9时所得到的商是余数的3倍,这个自然数是_________.【例 4】有48本书分给两组小朋友,已知第二组比第一组多5人.如果把书全部分给第一组,那么每人4本,有剩余;每人5本,书不够.如果把书全分给第二组,那么每人3本,有剩余;每人4本,书不够.问:第二组有多少人?【巩固】一个两位数除以13的商是6,除以11所得的余数是6,求这个两位数.【例 5】有一个大于1的整数,除45,59,101所得的余数相同,求这个数.巩固1、有一个整数,除39,51,147所得的余数都是3,求这个数.2、在小于1000的自然数中,分别除以18及33所得余数相同的数有多少个?(余数可以为0)【例 6】两位自然数ab与ba除以7都余1,并且a b⨯.>,求ab ba【巩固】学校新买来118个乒乓球,67个乒乓球拍和33个乒乓球网,如果将这三种物品平分给每个班级,那么这三种物品剩下的数量相同.请问学校共有多少个班?【巩固】在除13511,13903及14589时能剩下相同余数的最大整数是_________.【例 7】20032与22003的和除以7的余数是________.【例 8】有一个整数,用它去除70,110,160所得到的3个余数之和是50,那么这个整数是______.【巩固】用自然数n去除63,91,129得到的三个余数之和为25,那么n=________【巩固】号码分别为101,126,173,193的4个运动员进行乒乓球比赛,规定每两人比赛的盘数是他们号码的和被3除所得的余数.那么打球盘数最多的运动员打了多少盘?【例 9】(《小学生数学报》数学邀请赛试题)六名小学生分别带着14元、17元、18元、21元、26元、37元钱,一起到新华书店购买《成语大词典》.一看定价才发现有5个人带的钱不够,但是其中甲、乙、丙3人的钱凑在一起恰好可买2本,丁、戊2人的钱凑在一起恰好可买1本.这种《成语大词典》的定价是________元.【巩固】(全国小学数学奥林匹克试题)商店里有六箱货物,分别重15,16,18,19,20,31千克,两个顾客买走了其中的五箱.已知一个顾客买的货物重量是另一个顾客的2倍,那么商店剩下的一箱货物重量是________千克.【例 10】求2461135604711⨯⨯÷的余数.【巩固】 (华罗庚金杯赛模拟试题)求478296351⨯⨯除以17的余数.【巩固】"2"20002222个除以13所得余数是_____.【巩固】 求89143除以7的余数.【巩固】 222212320012002+++++除以7的余数是多少?【巩固】 ()30313130+被13除所得的余数是多少?【巩固】 1996777777⋅⋅⋅个除以41的余数是多少?【例 11】一个大于1的数去除290,235,200时,得余数分别为a,2a+,则这个自然数是多少?a+,5【巩固】一个大于10的自然数去除90、164后所得的两个余数的和等于这个自然数去除220后所得的余数,则这个自然数是多少?【例 12】著名的裴波那契数列是这样的:1、1、2、3、5、8、13、21……这串数列当中第2008个数除以3所得的余数为多少?【巩固】(2009年走美初赛六年级)有一串数:1,1,2,3,5,8,……,从第三个数起,每个数都是前两个数之和,在这串数的前2009个数中,有几个是5的倍数?【例 13】托玛想了一个正整数,并且求出了它分别除以3、6和9的余数.现知这三余数的和是15.试求该数除以18的余数.课 后 作 业练习1. 两数相除,商4余8,被除数、除数、商数、余数四数之和等于415,则被除数是_______.练习2. 已知2008被一些自然数去除,所得的余数都是10,那么这样的自然数共有多少个?练习3. 1013除以一个两位数,余数是12.求出符合条件的所有的两位数.练习4:有一个自然数,除345和543所得的余数相同,且商相差33.求这个数是多少?练习5:若2836,4582,5164,6522四个自然数都被同一个自然数相除,所得余数相同且为两位数,除数和余数的和为_______.练习6:2008222008+除以7的余数是多少?【备选5】一个自然数被7,8,9除的余数分别是1,2,3,并且三个商数的和是570,求这个自然数.。
数学运算余数问题

数学运算余数问题
在数学运算中,余数问题是一个常见的问题类型。
余数是指在整数除法中,被除数减去除数与商的乘积后得到的剩余部分。
例如,在计算 10 ÷ 3 时,商是 3,除数是 3,被除数是 10。
根据余数的定义,我们可以计算得到余数为 1,因为 10 - 3 × 3 = 1。
在解决余数问题时,我们需要掌握几个关键点:
余数必须是一个非负整数,即余数大于等于0。
如果被除数小于除数,那么余数为0。
余数是除法的结果的一部分,它反映了被除数未被完全除尽的部分。
余数有特定的性质,如余数的和等于两个被除数的和除以除数的余数,余数的乘积等于两个被除数的乘积除以除数的余数等。
这些性质在解决复杂数学问题时非常有用。
在解决具体问题时,我们需要根据题目的要求和条件来选择合适的方法。
例如,我们可以通过整除的性质来确定余数的范围,或者通过循环计算来找到满足条件的余数。
同时,我们还需要注意运算的顺序和精度,以避免出现错误的结果。
总之,余数问题是一个重要的数学概念,它涉及到整数除法、模运算等多个方面。
通过掌握余数的定义、性质和解题技巧,我们可以更好地解决各种数学问题。
大位数乘除取余法

大位数乘除取余法
“大位数乘除取余法”是一种大数运算方法,主要用于大数除法中求余数。
该算法的基本思想是反复做减法,通过比较被除数和除数的大小,逐步求出余数。
下面是一个简单的示例:
假设有两个大整数$a$和$b$,$a\neq0$,$b\neq0$。
- 当$a=b$时,$a\div b=1$,余数为$0$。
- 当$a>b$时,$a\div b\ge1$,余数需要通过计算求得。
- 当$a<b$时,$a\div b=0$,余数就是$a$。
以$28536$除以$23$为例,求余数的过程如下:
开始商为$0$。
- $28536\div23=1248\ldots10$,余数为$10$。
- $28536\div23=1248\ldots5$,余数为$5$。
- $28536\div23=1248\ldots2$,余数为$2$。
- $28536\div23=1248\ldots0$,余数为$0$。
因此,$28536$除以$23$的余数为$0$。
大位数乘除取余法在实际应用中,可以有效地处理大数运算中取余的问题,并且具有计算速度快、准确性高等优点。
奥数数论题库17-余数问题_知识例题精讲

余数问题是数论知识板块中另一个内容丰富,题目难度较大的知识体系,也是各大杯赛小升初考试必考的奥数知识点,所以学好本讲对于学生来说非常重要。
许多孩子都接触过余数的有关问题,并有不少孩子说“遇到余数的问题就基本晕菜了!”余数问题主要包括了带余除法的定义,三大余数定理(加法余数定理,乘法余数定理,和同余定理),及中国剩余定理和有关弃九法原理的应用。
一、带余除法的定义及性质一般地,如果a是整数,b是整数(b≠0),若有a÷b=q……r,也就是a=b×q+r,0≤r<b;我们称上面的除法算式为一个带余除法算式。
这里:(1)当0r=时:我们称a可以被b整除,q称为a除以b的商或完全商(2)当0r≠时:我们称a不可以被b整除,q称为a除以b的商或不完全商一个完美的带余除法讲解模型:如图这是一堆书,共有a本,这个a就可以理解为被除数,现在要求按照b本一捆打包,那么b就是除数的角色,经过打包后共打包了c捆,那么这个c就是商,最后还剩余d本,这个d就是余数。
这个图能够让学生清晰的明白带余除法算式中4个量的关系。
并且可以看出余数一定要比除数小。
二、三大余数定理:1.余数的加法定理a与b的和除以c的余数,等于a,b分别除以c的余数之和,或这个和除以c的余数。
例如:23,16除以5的余数分别是3和1,所以23+16=39除以5的余数等于4,即两个余数的和3+1.当余数的和比除数大时,所求的余数等于余数之和再除以c的余数。
例如:23,19除以5的余数分别是3和4,所以23+19=42除以5的余数等于3+4=7除以5的余数,即2.2.余数的乘法定理a与b的乘积除以c的余数,等于a,b分别除以c的余数的积,或者这个积除以c所得的余数。
知识点拨教学目标5-6余数问题例如:23,16除以5的余数分别是3和1,所以23×16除以5的余数等于3×1=3。
当余数的和比除数大时,所求的余数等于余数之积再除以c的余数。
数字的余数学习求两个数字的余数
数字的余数学习求两个数字的余数数字的余数是在数学中常见的概念,它是指一个数字除以另一个数字所得的剩余部分。
余数的计算在日常生活和科学研究中都有广泛的应用,尤其在编程、密码学和数论等领域中更是重要。
本文将介绍数字的余数的概念、求余的方法以及应用场景。
一、余数的定义与性质余数是指两个整数相除时所得的剩余部分。
例如,当5除以3时,商为1,余数为2。
这里的商是两个整数相除所得的整数部分,而余数则是指这个除法操作所剩下的部分。
余数有一些性质值得我们关注:1. 余数一定小于除数。
例如,当5除以3时,商为1,余数为2,而3大于2。
2. 如果两个数相除时,余数为0,那么这两个数互为倍数关系。
例如,当9除以3时,商为3,余数为0,说明9是3的倍数。
3. 余数不仅适用于正整数,也适用于负整数和小数。
例如,当-5除以3时,商为-2,余数为1,这里的商和余数都可以是负数。
二、求余的方法在求余的过程中,有多种方法可供选择。
常用的方法包括短除法、取模运算符和数学公式计算。
1. 短除法短除法是一种简便的手算方法,通过将被除数从左到右的一位一位进行减法操作,直到不能再减为止,剩下的数即为余数。
例如,求12除以5的余数:12 ÷ 5 = 2 (2)这里的2是商,而最后的2是余数。
2. 取模运算符在编程中,常用的方法是使用取模运算符(%)来求余。
取模运算符是一种用来计算一个数除以另一个数后所得余数的运算符。
例如,在Python中求12除以5的余数的表达式为:12 % 5这个表达式的结果为2,即12除以5的余数。
3. 数学公式计算除了短除法和取模运算符,还可以利用数学公式来计算余数。
例如,可以使用以下公式来求两个整数除法的余数:余数 = 被除数 - 商 ×除数就像之前的例子,5除以3的商为1,被除数为5,除数为3,则根据以上公式:余数 = 5 - 1 × 3 = 2所以,5除以3的余数为2。
三、数字的余数的应用场景数字的余数在实际应用中具有广泛的应用场景。
数论(5)余数问题教案
教案教师:__ 王鑫___ 学生:_ 刘竞琰上课时间:学生签字:____________数论(五) 余数问题【知识点概述】一、带余除法的定义及性质:1.带余除法的定义:一般地,如果a是整数,b是整数(b≠0),若有a÷b=q……r,也就是a=b×q+r, 0≤r<b;(1)当时:我们称a可以被b整除,q称为a除以b的商或完全商(2)当时:我们称a不可以被b整除,q称为a除以b的商或不完全商2.和余数相关的一些重要性质:(以下a,b,c均为自然数)性质1:余数小于除数性质2:性质3:a与b的和除以c的余数,等于a,b分别除以c的余数之和,或这个和除以c的余数。
例如:23,16除以5的余数分别是3和1,所以23+16=39除以5的余数等于4,即前两个余数的和3+1.当余数的和比除数大时,所求的余数等于余数之和再除以c的余数。
例如:23,19除以5的余数分别是3和4,所以23+19=42除以5的余数等于3+4=7除以5的余数,即2.性质4:a与b的乘积除以c的余数,等于a,b分别除以c的余数的积,或者这个积除以c所得的余数。
例如:23,16除以5的余数分别是3和1,所以除以5的余数等于。
当余数的和比除数大时,所求的余数等于余数之积再除以c的余数。
例如:23,19除以5的余数分别是3和4,所以除以5的余数等于除以5的余数,即2.【注】对于上述性质3,4,我们都可以推广到多个自然数的情形,尤其是性质4,对于我们求一个数的n次方除以一个数的余数时非常的有用。
二、数的同余1.同余定义若两个整数a、b被自然数m除有相同的余数,那么称a、b对于模m同余,用式子表示为:a≡b ( mod m )同余式读作:a同余于b,模m由同余的性质,我们可以得到一个非常重要的推论:若两个数a,b除以同一个数m得到的余数相同,则a,b的差一定能被m整除用式子表示为:如果有a≡b ( mod m ),那么一定有a-b=mk,k是整数,即m|(a-b)这个性质非常重要,是将同余问题与前面学过的整除问题相联系的纽带,一定要熟练掌握。
余数的运用
余数的运用首先,我们来定义余数。
余数是一个数除以另一个数所得到的整数部分之外的部分。
换句话说,如果一个数除以另一个数,商为整数部分,余数为余数部分。
例如,8除以3,商为2,余数为2;10除以4,商为2,余数为2余数的性质有以下几点:1.余数不会小于0。
因为余数是除法运算之后得到的,它必定是非负整数。
2.如果两个数除以同一个数得到的余数相等,那么这两个数的差是该数的倍数。
例如,如果a除以b得到的余数为r,b除以c得到的余数也是r,那么a-b是b的倍数,b-c是c的倍数。
3.如果两个数除以同一个数得到的余数不相等,但除法得到的商相等,那么这两个数的差是该数的倍数。
例如,如果a除以b得到的余数为r1,b除以c得到的余数为r2,但a/b=b/c,那么a-b是b的倍数,b-c是c的倍数。
现在我们来看一些经典问题中余数的运用。
1.求余数问题:求一个数除以另一个数的余数是一个常见的问题。
比如,求24除以7的余数。
我们可以用除法运算得到商为3,余数为3、因此,24除以7的余数为32.除法算术的变化:我们可以利用余数来改变除法算术的运算方式。
例如,我们要求27除以6的商,并将商转换为小数。
我们可以先求余数,然后将余数除以6得到小数部分。
27除以6,商为4,余数为3、3除以6,小数为0.5、因此,27除以6的小数部分为0.5,整数部分为4,即27除以6等于4.5 3.进制转换:余数的运用在二进制、八进制和十六进制的转换中非常重要。
在二进制中,余数只有0和1两个值,可以把余数转换成相应的数字。
例如,我们要把二进制数1101转换成十进制数,可以将1对应为2的0次方,0对应为2的1次方,1对应为2的2次方,1对应为2的3次方。
然后,将这些数相加得到十进制数134.周期性问题:余数的周期性特征在解决一些周期性问题时非常有用。
例如,我们要计算2024年第N天是星期几。
我们知道一周有7天,所以可以通过求模运算来得到相应的余数。
余数问题的通解
余数问题的通解余数问题的通解,是指在(正)整数范围内,未知被除数Z1、Z2……Zn,除以已知除数A1,A2……,所得未知商X1,X2,…和已知余数b1,b2,……,求被除数任一项Zn。
(所有数列均由小到大排列)。
现以实例说明求Zn的方法。
Zn各项,除以5余4,除以11余7,除以17余12。
求Zn。
(1)列方程:Z1=5X1+4 ①Z1=11X2+7 ②Z1=17X3+12 ③(2)最小值:余数问题方程必须满足:①使各方程的值相等;②使X最小,以实现Z 值最小。
由式①、②得:5X1=11X2+3,由此式知:使X2最小,且使等式右边等于5的整倍数。
由此,观察、试算得:X2=2,X1=5,Z1=29。
将Z1代入式③得X3=1为整数,则试算成功。
(3)通解式:Zn等于除数的最小公倍数的(n-1)倍与Z1之和。
则Zn=5×11×17(n-1)+29=935n-906 ④由式④验算:当n=1,Z1=29;当n=5,Z5=3769;29÷5=5余4,29÷11=2余7, 29÷17=1余12;3769÷5=75余4, 3769÷11=342余7, 3769÷17=221余12。
故满足题中条件。
由式④知:余数问题的通解,为一等差数列的通项,但余数问题是在(正)整数范围内研究问题。
因此,等差数列的通项,不一定就是余数问题的通解。
余数问题通解的统一形式为:Zn=(gmax a1a2…)n±B=gminn±B ⑤其中gmax 和gmin为除数的最大公约数和最小公倍数,a1=A1÷gmax ,a2=A2÷gmax , n为项数,B= Z1-gmin ,当Z1>gmin时,式⑤中B左取“+”,否则取“-”。
当B=0,得整除通解为:Zn= gminn ⑥当B<A1且B左为“+”,得同余B的通解为:Zn= gminn+B ⑦当B<A1且B左为“-”,得同欠B的通解为:Zn= gminn-B ⑧当B>A1且B左为“-”,得余(欠)均不同或不完全相同的通解为:Zn= gminn-B ⑨思考习题:1、Zn被5和7整除,求Zn,并验证式⑥。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
大整数求余数的问题分析
问题描述
最近在学习一些资料的时候正好看到一些和大整数求余数相关的问题,这些问题粗粗看来似乎有点麻烦。
但是当结合一些有关数学的特性来分析时,会觉得很有意思。
问题1:求一个整数X的N次方除以某个整数P的余数。
用数学公式表示则如下:
其中N >= 0, P > 0.
这个问题需要考虑的就是如果N比较大的时候,很可能就超出我们所用一般数据类型所能表示的范围。
如果直接去求X的N次方,就算有数据能保存的下来,肯定也会消耗大量的时间和空间。
问题2:给定一个很大的数,求它除以某个整数P的余数。
这个数因为足够大到没办法用普通的数据类型来表示,所以需要用一个整数类型的数组或字符串来保存。
结果也是要求X mod P
问题1分析
最初分析
我们先来看第一个问题。
这个问题假定X和P并不是太大,可以用一个计算机的常用数据类型来表示。
一种最简单直白的方法就是我们直接将所有N个X相乘,然后再对被除数P相除,求余数。
当然,这是基于一个前提,我们有能够保存足够大的数据类型。
如果我们对这种思路的时间和空间复杂度做一个粗略的估计的话,会发现,假设X是int类型的整数,占4个字节,而最坏的情况就是每次相乘的结果就占用的结果增加4个字节,这样N次乘积就需要占用4N字节的空间。
而如果算上每次相乘的中间结果,占用的空间就达到N*N的量级。
再看时间复杂度,假定两个int类型的整数乘积的运算时间单位为1的话,在没有任何优化假定的前提下,一个32位整数和64位整数乘积的时间则为原来的两倍。
如果以这个标准来分析的话,后面的时间复杂度也到了N*N量级。
第一步改进
可见,虽然前面这种办法虽然理论上可行,但是实际上时间和空间复杂度太大,不太合适。
现在我们再来看看另外一种思路。
因为问题的关键就是指数N比较大,如果能将指数能够降下来,将其转换成对等的表达式,则问题就好解决了。
我们看前面求乘积的过程,假定是最简单的情况,N =2,则相当于求(X * X) mod D. 如果利用整数求余数的性质,我们发现他们满足下面的性质:
这个等式的证明可以参照相关的数学材料或者文章后面的补充证明部分。
通过这个性质,至少我们可以发现,对于两个数的乘积求余数,我们可以先求一个数的余数,然后再将这个余数乘以另外一个数再求余数。
这样就可以求出来两个数乘积的余数。
那么,如果对于3个,4个甚至更多的数的乘积求余数呢?我们可以将这个等式扩展一下,对于3个数的乘积,我们可以先求出前面两个数乘积的余数,再和第三个数相乘求。
依次类推,重复N次就可以求出N次方的结果。
于是,基于这种思路,我们可以写出如下的代码:
Java代码
1.public static long power(long x, long n, long p)
2.{
3.if(n == 0)
4.return1;
6.long tmp = x % p;
7.for(long i = 0; i < n - 1 ; i++)
8. {
9. tmp = (x * tmp) % p;
10. }
11.return tmp;
12.}
这种方法和前面的思路比起来,有一个进步的地方,就是每次运算的时候都对中间结果求模运算,使得结果都在普通数据类型可以保存的范围内,这样不会需要额外的存储空间。
而时间的复杂度主要取决于运算的指数,所以时间复杂度为o(N)。
这样我们就找到了一个还不错的解决方法了。
再进一步考虑
前面的办法虽然是已经在一个o(N)的范围了,可是如果N很大的话,我们还是要做一个很大的循环运算。
还有没有可能使得我们的方法更加有效率呢?我们求X的N次方,可以根据N的性质做如下的分析:
当N为偶数的情况下:
那么,就有如下的等式成立:
后面这一部分的等式成立是基于模运算的这么一个特性:
当N为奇数的情况下,则有:
那么,结合前面讨论的公式,对奇数情况下求模,则结果为如下等式:
综合前面的两种情况,我们可以发现,当N为偶数时,我们可以求X的平方再取模,如果是奇数的话则要再乘以X,然后取模。
这样,一次运算下来,我们就将指数N折半了。
按照这个过程,整个过程的时间复杂度可以降低到对数的级别上来。
根据讨论的递归关系,我们可以得出如下递归方式的代码:
Java代码
1.public static long power(long x, long n, long p)
2.{
3.if(n == 0)
4.return1;
5.
6.long tmp = power((x * x) % p, n / 2, p);
7.
8.if(n % 2 != 0)
9. tmp = (tmp * x) % p;
10.
11.return tmp;
将递归版本转换成循环实现的方式的代码如下:
Java代码
1.public static long loopPower(long x, long n, long p)
2.{
3. x %= p;
4.long tmp = 0;
5.
6.while(n > 0)
7. {
8. tmp = (x * x) % p;
9.if(n % 2 != 0)
10. tmp = (tmp * x) % p;
11. n /= 2;
12. }
13.
14.return tmp;
15.}
问题2分析
结合前面的情况,因为问题2中本身需要求模运算的数字比较特殊,不是用一个普通的数据类型来保存,而是用的整型数组或者字符串数组。
在这种情况下,我们需要考虑的是利用一些模运算的特性,使得整个运算的过程拆分成可运算的各个小的步骤。
在这里,我们先假设是10进制的数字,比如说一个int数组[1, 2, 3, 4, 5, 6],那么他们实际对应的这个数字应该是如下:
这就相当于转换成了一个多项式求和的问题。
对于一个整型的数组表示的长数据,我们按照多项式方式求和的典型代码如下:
Java代码
1.public static long sum(int[] array)
2.{
3.long sum = 0;
4.for(int i = 1; i < array.length; i++)
5. {
6. sum = sum * 10 + array[i];
7. }
8.return sum;
9.}
如果再结合一些模运算的性质来考虑,比如,对多个数字的相加再求模和先对中间部分结果求模再相加之后求模的结果是一样的。
那么,我们可以得出一个通用的求模运算的方法:
Java代码
1.public static long sum(int[] array, int base, int p)
2.{
3.long sum = 0;
4.for(int i = 1; i < array.length; i++)
5. {
6. sum = sum * base + array[i];
7. sum %= p;
8. }
9.return sum;
10.}
这里,base表示数的进制,可以是10以外的其他进制。
总结:
前面针对大整数的两种情况进行了讨论,一种是给定一个整数,然后有一个比较大的指数,这种情况下需要考虑将指数变小给降下来。
这里要利用到模运算里底数可以结合的特性。
而针对一个很长的整数,我们可以将他转换成多项式求和的形式。
这里就利用了多个数字求和取模和部分结果先取模再求和取模的结果一致这个特性。
问题本身不是很复杂,主要是要把这几种特性想清楚,给用好了。
总的来看,确实有点绕。
补充证明:
我们先来证明如下的等式成立:
因为X, Y都要对P求模,而实际上X, Y 都可以表示成 X = A*P + B 的形式,其中B就是X mod P的结果。
那么前面的A*P这部分则是对于P可整除的。
(X * Y)= (A * P + B)* Y = A * P * Y + B * Y
如果对这个等式的右边求模的话,显然A*P*Y这一部分是P的倍数,求模后的结果为0,则结果为(B * Y) mod P,前面我们知道B = X mod P。
这样我们就证明了(X * Y) mod P = [X(Y mod P)] mod P。
后面这部分的证明可以类似推导出来。
我们再证明下面的等式成立:
按照前面一部分的讨论,我们可以假设X = A * P + B, 那么原来的等式则转化为:
在右边的等式中,如果我们按照二项式定理将它展开,那么他们将成为很多项乘积的和。
但是所有和A*P 相乘的项都可以被P整除,那么这些项的结果最终都是0,只有不含有A*P的项对最后的结果有效。
展开后唯一有效的部分就是B^N。
而B本身就是X mod P。
那么我们也就证明了上面等式的成立。
参考材料:
data structures and problem solving using java。