数论学习之扩展欧几里德
扩展欧几里德
1.定义:
扩展欧几里德定理
对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然存在整数对 x,y ,使得 gcd(a,b)=ax+by。
2.c语言实现
#include <stdio.h>
int q,x, y;
void swap ( int *x1, int *y1)
{
int temp;
temp = *x1;
*x1 = *y1;
*y1 = temp;
}
void fun( int a, int b)
{
if (b == 0 ) {
x = 1;
y = 0;
q = a;
}
else {
fun ( b, a % b);
int temp = x;
x = y;
y = temp -( a / b ) * y;
}
}
int main( )
{
int a, b;
while (scanf("%d%d", &a, &b), a || b ) {
if ( a < b )
swap(&a , &b);
fun(a, b);
printf("%d = %d * %d + %d * %d \n",q,a,x,b,y);
}
return 0;
}
3.应用求一元线性同余方程
#include <stdio.h>
int x, y,q;
int a1, b1, c;
void swap(int &x1, int &x2)
{
int temp;
temp = x1;
x1 = x2;
x2 = temp;
}
void fun( int a, int b)
{
if ( b == 0)
{
x = 1;
y = 0;
q = a;
}
else
{
fun (b,a % b);
int temp = x;
x = y;
y = temp -( a / b) * y;
}
}
int gcd ( int n, int m)
{
return m ? gcd(m, n % m ) : n;
}
void exp( )
{
int x1, i;
x1 = gcd(a1 ,c );
if (b1 % x1 != 0)
return;
//求解ax = b (mod c) ax +cy = b;
a1 =a1 / x1;
b1 =b1 / x1;
c = c / x1;
if ( a1 < c)
swap(a1, c);
fun(a1, c);
for ( i = 0; i < 10; i++) {
printf("x = %d\n", b1 * x + c * i);
printf("y = %d\n", b1 * y - a1 * i);
puts("");
}
}
int main( )
{
//求解ax = b (mod c) ax +cy = b;
while (scanf("%d%d%d",&a1, &b1,&c) != EOF ) {
// if ( a1 < b1)
// swap(a1, b1);
// fun(a1,b1);
exp( );
// puts("");
printf("%d= %d * %d+ %d * %d\n",q,a1, x,c, y );
}
return 0;
}
求a * x + b * y = n的整数解。
1、先计算Gcd(a,b),若n不能被Gcd(a,b)整除,则方程无整数解;否则,在方程两边同时除以Gcd(a,b),得到新的不定方程a' * x + b' * y = n',此时Gcd(a',b')=1;
2、利用上面所说的欧几里德算法求出方程a' * x + b' * y = 1的一组整数解x0,y0,则n' * x0,n' * y0是方程a' * x + b' * y = n'的一组整数解;
3、根据数论中的相关定理,可得方程a' * x + b' * y = n'的所有整数解为:
x = n' * x0 + b' * t
y = n' * y0 - a' * t
posted on 2011-07-21 17:16 more think, more gains 阅读(144) 评论(0) 收藏 举报
浙公网安备 33010602011771号