通过逆元实现大数据除法的取模

当题目中数据较大,而且计算中出现过除法的时候。往往取模会出错

当计算 (A/B) % c    等价于  (A*B1)% c

其中 B1 是 B 的逆元。

那么逆元如何求呢。

先给出逆元的定义

a*x ≡1 (mod n)  ,如果x是方程的解,则x称作 a 关于模 n 的逆。

a的逆元存在是有条件的: 方程ax-ny==1 要有解 则 1必须是gcd(a,n)的倍数 ,因此,a和n必须素质,

即 gcd(a,n)==1 在这个前提下 ax≡1(mod n) 只有唯一解。



现在我们来证明上面的结论:用若b*b1 % c == 1,则( a/b ) % c != ( a*b1 ) % c

若我们证明这一命题是错误的,我们目的就达到了。

令,a/b   == k1*c+y1
    a*b1 == k2*c+y2
原来的证明则变成了:若b*b1 % c == 1,则 y1!=y2

两式相减,有 a/b-a*b1 == (k1-k2)*c + (y1-y2)
设 k == k1-k2
     y == y1-y2
有,a/b-a*b1 == k*c + y
左右乘以b,有 a*(1-b*b1) == k*b*c + b*y
左右模上c,
左边 == a*(1-b*b1)%c
        == ( a*( 1%c - b*b1%c ) )%c
        == 0
右边 == (k*b*c + b*y)%c
        == b*y%c
因为a/b为整除,b显然不会是0,那么y必须是0,这与命题矛盾,证毕

为什么求逆元会用扩展欧几里得?

我们的目标,其实是解b*b1 % c == 1
令 b*b1 == k*c + 1
即 -k*c + b*b1 == 1
仔细观察,这个不就是扩展欧几里得嘛。

那么,为什么gcd(b,c)==1,才会有逆元变得简单了。
因为 1 % gcd(b,c) == 0 ,扩展欧几里得才有解,具体来说,gcd(b,c)只能为1


其实还有一种比较优的方法(快速幂,费马小定理)

费马小定理:是若a为整数,p为素数,则可写出同余方程a^(p-1)≡1(mod p)

故a*a^(p-2)≡1(mod p),a^(p-2)是a的逆元。

一个快速幂搞定。



通过逆元实现大数据除法的取模

时间: 2024-10-25 06:04:04

通过逆元实现大数据除法的取模的相关文章

小明哥教你使用c++实现大数据之加减乘除以及模除运算

在c++中常用的数据类型有 char:1 bit,short 2 bit,int 4 bit,long long 8 bit等等,以上数据类型标识的数据大小非常有限,如果遇到大于他们能表示的范围时,计算结果就会有误,日常生活中的计算器也是如此,我国计算两个比较大的数的运算,也会出现错误,或者不能正常显示, 例如计算123456789123456789*987654321987654321 计算结果如下: 为了解决上述问题,我写了一个计算大数据四则运算以及求模的小项目,实现的功能有 + - * /

多项式 - 除法与取模

一类问题:给定一个 \(n\) 次多项式 \(F(x)\) 和一个 \(m\) 次多项式 \(G(x)\),请求出多项式 \(Q(x)\),\(R(x)\),满足以下条件: \(Q(x)\) 次数为 \(n?m\),\(R(x)\) 次数小于 \(m\) \(F(x)=Q(x)?G(x)+R(x)\) 所有的运算在模 \(998244353\) 意义下进行. 多项式求逆 放一篇博客.直接做多项式的除法是无从下手的,或者说没有很优秀的方法可以优化它的复杂度. 然而逆元是个很方便的东西,乘法和除法是

Divide two numbers,两数相除求商,不能用乘法,除法,取模运算

问题描述:求商,不能用乘法,除法,取模运算. 算法思路:不能用除法,那只能用减法,但是用减法,超时.可以用位移运算,每次除数左移,相当于2倍. 1 public class DividTwoIntegers { 2 public int divide(int dividend, int divisor) 3 { 4 if(divisor == 0) return Integer.MAX_VALUE; 5 if(divisor == -1 && dividend == Integer.MIN

3.29省选模拟赛 除法与取模 dp+组合计数

LINK:除法与取模 鬼题.不过50分很好写.考虑不带除法的时候 其实是一个dp的组合计数. 考虑带除法的时候需要状压一下除法操作. 因为除法操作是不受x的大小影响的 所以要状压这个除法操作. 直接采用二进制状压是不明智的 2的个数最多为13个 2^13也同样到达了1e4的复杂度. 考虑 hash状压 即 2的个数有x个 那么我们就有状态w表示2还有x个. 这样做的原因是把一些相同的东西给合并起来 而并非分散开来.即有多个2直接记录有多少个即可. 可以发现 这样做不同的除数最多只有5个 状态量较

大数据除法(Large data division)

题目描述 Description 除法是计算中的基础运算,虽然规则简单,但是位数太多了,也难免会出错.现在的问题是:给定任意位数(足够大就可以啦O(∩_∩)O)的一个被除数,再给定一个long long类型的除数,求它的余数,并保留小数点后s位. 输入输出格式 Input/output 输入格式:三行: 第一行:被除数 第二行:除数 第三行:一个数s,表示保留小数点后s位 输出格式:一行数,表示计算的结果(不可以有前导0) 输入输出样例 Sample input/output 样例测试点#1 输

带除法的取模运算

type1 $\frac{x}{y}\%P,其中P是大质数$ 用费马小小定理得: $y^{P-1}\equiv 1(mod P)$ 故: $\frac{x}{y}\%P=\frac{x*y^{P-1}}{y}\%P=x*y^{P-2}\%P$ type2 $\frac{x}{y}\%P,其中x和y可分解质因数$ 我们还是用一些例子来讲比较好一些. 求卡特兰数$\frac{C_{2n}^{n}}{n+1}\%P$ $\frac{C_{2n}^{n}}{n+1}\%P$ $=\frac{(n+2)\

海量数据查询关系型数据库存储大数据,要点就是:简单存储、分区分表、高效索引、批量写入

海量数据查询 https://www.cnblogs.com/nnhy/p/DbForBigData.html 相当一部分大数据分析处理的原始数据来自关系型数据库,处理结果也存放在关系型数据库中.原因在于超过99%的软件系统采用传统的关系型数据库,大家对它们很熟悉,用起来得心应手. 在我们正式的大数据团队,数仓(数据仓库Hive+HBase)的数据收集同样来自Oracle或MySql,处理后的统计结果和明细,尽管保存在Hive中,但也会定时推送到Oracle/MySql,供前台系统读取展示,生成

除法运算和取模

package review20140420;/* * 除法和取模(整数除以整数,会出现除数不能为零的异常) */public class Test2 {    //程序的入口    public static void main(String[] args) {        /*定义变量a,b*/        double a=5.2;        double b=3.1;        //除法运算        double div=a/b;        //取模运算      

组合数取模终极版

以前讲述过很多组合数取模问题,详见:http://blog.csdn.net/acdreamers/article/details/8037918 今天,我们继续学习一些稍有难度的组合数取模问题,比如大组合数对合数取模,求大组合数的最后位数字等等. 首先来看组合数对合数取模问题 问题:求的值,其中和,并且是合数. 分析:先把素因子分解,然后转化为求,这里为素数,然后用CRT合并.所以现在重点来研究 如何求的值.这个问题AekdyCoin大神已经详细讲述了,如下链接     链接:http://h