数论学习之扩展欧几里德

扩展欧几里德

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)    收藏  举报

导航