2012 NOIp 그룹 합동 방정식을 개선하기 위해

합동 : 숫자 이론에서 중요한 개념. 양의 정수 m이 주어 두 정수 a 및 b를 만족하는 (AB) m으로 분할 될 수있다, 즉 (AB) / m은 정수를 구하는 경우,

이어서 정수 a와 b는 일치하는 모듈로 m, 표시 a≡b MOD (m)되어있다. 합동 모듈러스 m은 하나 개의 등가 관계의 정수이다.

같은 나머지 두 개의 정수 적합성이있는 경우 두 개의 정수와 수학적으로 적합성은 정수로 나눈.

두 정수들이 정수 m으로 나눈되는 (a), (b)는 I와 동일하고, A 및 B는 합동 모듈러스 m 또는 B 모듈러스 m에 대해 합동이라고

a≡b이라 MOD (m)

ㄴ m, a 및 b에 몰드 합동으로 읽기 또는 합동 모듈로 m을 읽었다.

예컨대 26≡2 MOD (12)

m 제공된 정의는 양의 정수보다 1, A, B에서의 정수, m 경우 (| & AB)는 A와 B는 A와 일치하는 모듈로 m, 표시 a≡b MOD (m)라고하고, 판독 B 합동 모듈러스 m.

분명히, 그 사실이있다

(1) 만약 a≡0 MOD (m)은 m하기 |;

(2) a≡b은 MOD (m)이 동등 m 및 B는 동일 나머지에 의해 제거된다.

[시험]

자족 : m | (AB) -> a≡b (모드 m)

A = R1 + MQ1 설정, B = MQ2 + R2

그리고 0≤r1, R2 <m

∵ m | (AB)

및 AB = m (Q1-Q2) + (R1-R2).

∴ n이 일정해야하므로 그 (R1-R2) = MN

(R1-R2) | m이 있습니다.

∵0≤r1, R2 <m,

∴0≤ | R2-R1 | <m

∴r1 - R2 = 0

즉, R1 = R2.

따라서 a≡b (MOD m).

필요성 : a≡b (모드 m) -> m | (AB)

, B A를 설정하고, 나머지는 m r에 의해 제거하고,

A = MQ1 + R, B = MQ2 + R을 即.

∵ab m = (Q1-Q2)

∴m | (AB).

자연의 합동은 주로 다음의 몇 가지에 더있을 것입니다 :

같은 제수, 및 이들의 수 (또는 차이), 그 나머지 부분과 (또는 차) 합동의 수 1.

같은 제수 2. 두 수의 제품은 그들이 합동의 수의 제품보다 더 있습니다.

3. 동일한 제수를 들어, 두 개의 정수가 일치하는 경우, 그 후에는 확실히이 제수 나눌 차이 일 것이다.

두 숫자 일치하는 경우 같은 제수 4., 그들의 힘은 같은 것보다 여전히 더 많은 것이다.

응용 프로그램의 적합성 :

예 : 13로 나눈 나머지를 추구하는 2001 ^ 2003

합동 속성 4 항에있어서, 우리는 결론을 내릴 수 2,001 2,003 ^ ^ 2003≡12 MOD (13) (동일한 금형 (13)보다 2001 12 이상)이

^ 2003 (12)는 우리가 13 적합성 1 ~ 12 평방 금형으로 몇 번을 발견 할 것이다, 13로 나눈 찾기 어렵습니다, 여전히 많은 수이다.

시험은 그릴 수 12 ^ 2≡1 MOD (13)

우리는 1001 × 12 ^ 1≡1 × 12≡12 MOD (13) ^ 2003 ^ 12 (12 ^ 2)로 1,001 × 12 ^ 1 및 (12 ^ 2) ^ 분할

이 시점에서, 우리는 13로 나눈 ^ 2003 2001의 나머지 부분을 그릴 수있는 대답은 바로, 우리가 계산기를 사용하여 계산 (12)이다.

수론, 선형 합동 방정식 적합성의 기본 방정식 "선형"미지 방정식의 수는 이와 같이, 한번이다 나타낸다 :

ax≡b (MOD N) 방정식. 최대 공약수를 나누어가 B 및 N 일 경우에만 경우 방정식이 용액을 보유 (GCD로서 (a, N으로 함) | b).

X0는 식의 용액 인 경우이 경우에는, 모든 솔루션은 다음과 같이 표현 될 수있다 :

{X0 + KN / D | (k∈z)}

여기서 D는 N의 최대 공약수이다. 완전 모듈러스 N의 나머지 행은 {0,1, ..., N-1}, 정확한 솔루션을 거라고.

선형 합동 식 도끼 ≡의 B (MOD N) (1)

(a, n)은 D = GCD, B로 나눈 값을 D 후 B / D는 정수이다. AR + SN = D 유클리드 사용될 수있는 정수를 정리하여 슈 페이 (R, S)

따라서 X0 = RB / d는 식 (1)의 용액이다. 다른 솔루션은 N / D 및 X에 대해 합동이다. 즉 x≡x0 + (N / D) * t (MOD N) (0≤t≤d-1).

예를 들어, 수학 식 (D) (20) (12X) ≡ (MOD 28) = GCD (12,28) = 4.

주 (-2) 281 (4) = 12, 따라서 x0≡5 * (- 2) ≡-10 ≡4 (MOD 7) 용액이다.

모듈 (28)의 경우, t = 1, x≡4 + (4분의 28) * 1≡11 MOD (28);

       t=2,x≡4+(28/4)*2≡18 (mod 28);

   t=3,x≡4+(28/4)*3≡25 (mod 28) 。

모든 솔루션은 {4,11,18,25}입니다.

X 1 (MOD B) 용액에 대하여 최소의 양의 정수 도끼 ≡ 합동 식을 찾기.

즉 도끼 = MB를 찾고 + R 1 = NB + R

GCD = (a, b), (㎚ (Y)에 대응하는)에 의해 변형 AX + (㎚), B = 1, 즉, 팽창이 방정식 유클리드 애플리케이션 도끼 +

실제로 xolution 도끼 ≡1 (MOD B)가된다 GCD (a, b) | 1, 즉 GCD (a, b) = 1;

= 1에 의해 유클리드 확장 도끼 +를 사용하여 발견의 (X, Y는 정수)

유클리드의 정리를 확장

유클리드의 정리 확장 : 부전 두 0의 정수하면, B는 == GCD에 의해 용액의 X, Y되도록 도끼 + 세트가 있어야 (a, b);

유클리드 팽창을 달성하기가, 다음의 프로그램, X 및 Y는 전역 변수에 저장된

GCD의 INT (INT의 A, INT의 B)
{
INT의 T, D,
IF (B == 0)
{
X = 1].
Y = 0;
// 사례 B == 0, 즉 말하자면 GCD (a, 0) = = A. 원래 방정식해진다 A = AX + == 의해 GCD (a, b) -> (1) == X, Y == 0.
리턴 a 및를 리턴 // 최대 공약수의 B 값
}
D = GCD (B, %의 B) // 유클리드 최대 공약수 사용
T = X는,
X = Y,
Y = T- (A / B) * Y] // 2에서 알
복귀 D는, A, B를 리턴 // 값 GCD
}
// 2 ==의 GCD (a가함으로써 미지 도끼 + 설명 b) (1)
룰 설명, X는 Y가 제 재귀 X1의 값을 나타내는 경우, Y1은 제 재귀를 나타낸다 값.

이어서 GCD (a, b) == 동시에 GCD (B, A % B를), 수학 식 (1)로 치환되어,

==의 BX1 + (a %의 b) Y1 거기 도끼 +. 올바른 모양의 변형

BX1 + (a %의 b) == BX1 Y1 + (A- (a / b) b) == ay1 Y1 + B (X1-(a / b) Y1)

== ay1 + B (X1-(a / b) * Y1)에 의해 최종적으로 얻어진 도끼 +

즉 :

다음의 깊이 (X)의 Y1과 동일한 깊이,

다음 X1-(a / b) * (Y1)과 동일한 깊이 Y 깊이.

디바이더의 상기 유도를 사용하는 경우 * 것을 유의 정수 나눗셈있다

따라서, 용액 == GCD (a, b)이고, X, Y의 집합으로 부정사 도끼 +를 얻었다.

그래서 ==의 C에 의한 평균 부정사 도끼 +에 대한 솔루션을해야하는 것이다.

매우 간단한, X1 = X (C / GCD (A, B)), Y1 = Y (C / GCD (A, B))

좀 더 깊이, 그래서 사실 솔루션 세트를 해결하기 위해, 일반적으로 문제를 해결하지 않습니다

우리는 지금 그 다음은 무엇을이 솔루션의 모든 솔루션, 모든 싶어?

가정 GCD D = (a, b) = X0 + B 다음 X / D. T, Y = YO-A / D에 t, t는 임의의 일정한 정수이고.

다음과 같이 코드입니다 :

#include<stdio.h>
int  Extragcd(int a,int b,int *x,int *y)
{
    int d,t;
    if(b==0)  //递归调用终止条件,当根据欧几里得辗转相除法则,余数为0停止
    {
        *x=1;
        *y=0;
        return a;
    }
    else
    {
        d=Extragcd(b,a%b,x,y);
        t=*x;                  //根据下一个x1,y1的值,倒推前一个x,y的值
        *x=*y;
        *y=t-a/b*(*y);
        return d;
    }
}
int main()
{
    int a,b,x,y;
    int ans;
    scanf("%d%d",&a,&b);
    ans=Extragcd(a,b,&x,&y);   //同余方程 ax ≡1 (mod b) 有解的充分条件是 gcd(a,b)==1
    if(ans!=1) return 0;
                              //根据若x是方程的一个解,则方程的所有解为x+k*b k为整数
    x=x%b;                    //保证最小的正整数解x ,且x属于{0,1,2,3...b-1}
    while(x<=0)
        x+=b ;
    printf("%d\n",x);
    return 0;
}

추천

출처www.cnblogs.com/zi-nai-boboyang/p/11519409.html