首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

数论学习之启动篇(三)

2013-10-06 
数论学习之起步篇(三)1. 求解模线性方程中国剩余定理有以下一组模线性方程,求xx≡b1(mod m1)x≡b2(mod m2)..

数论学习之起步篇(三)

1. 求解模线性方程

中国剩余定理有以下一组模线性方程,求xx≡b1(mod m1)x≡b2(mod m2)    .    .    .x≡bn(mod mn)解为:x0≡(b1*M1*y1+b2*M2*y2+……+bn*Mn*yn) mod m 其中Mi=(m1*m2*m3*……*mn)/mi。而Mi*yi≡1(mod mi)#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<map>#include<queue>#include<stack>#include<vector>#include<ctype.h>#include<algorithm>#include<string>#define PI acos(-1.0)using namespace std;long long m[100],b[100],n;long long d,x,y;void ex_gcd(long long a, long long b, long long &d, long long &x, long long &y){    if (!b)    {        d=a;        x=1;        y=0;    }    else    {        ex_gcd(b,a%b,d,y,x);        y-=(a/b)*x;    }}long long chinaR(){    long long mm=1,a=0;    int i;    for (i=0; i<n; i++)        mm*=m[i];    for (i=0; i<n; i++)    {        long long M=mm/m[i];        ex_gcd(M,m[i],d,x,y);        a=(a+(x%mm)*M*b[i])%mm;    }    return (a%mm+mm)%mm;}int main (){    while(cin>>n)    {        if (!n) break;        for (int i=0; i<n; i++)            cin>>m[i]>>b[i];        long long a=chinaR();        cout<<a<<endl;    }    return 0;}


热点排行