유클리드 알고리즘 (뒤 집기 알고리즘: 최대 공약수 알고리즘)

1847 단어 알고리즘
유클리드 알고리즘 은 전전 상 제법 이 라 고도 부 르 는데 두 개의 정수 a, b 의 최대 공약 수 를 계산 하 는 데 쓰 인 다.그 계산 원 리 는 아래 의 정리 에 의존한다. 정리: gcd (a, b) = gcd (b, a mod b)
  
유클리드
증명: a 는 a = kb + r 로 표시 할 수 있 으 며, r = a mod b
d 가 a, b 의 공약수 라 고 가정 하면
  a % d == 0 , b% d = = 0, r = a - kb, 그러므로 r% d = = 0 
따라서 d 는 (b, a mod b) 의 공약수 이다.
d 가 (b, a mod b) 의 공약수 라 고 가정 하면
  b % d == 0 , r % d == 0 ,하지만 a = kb + r  그래서 a% d = = 0
그래서 d 도 (a, b) 의 공약수 이다.
따라서 (a, b) 와 (b, a mod b) 의 공약수 가 같 고 그 최대 공약수 도 반드시 같 으 며 증 거 를 얻 을 수 있다.
유클리드 알고리즘 은 바로 이 원리 에 근거 하여 만 든 것 이다.
/*==================================================*\

| GCD      

\*==================================================*/

int gcd(int x, int y)

{

     if (!x || !y) return x > y ? x : y;



     for (int t; t = x % y; x = y, y = t);

    

     return y;

}
}

/*==================================================*\

|    GCD

\*==================================================*/

int kgcd(int a, int b)

{

	if (a == 0) return b;

	if (b == 0) return a;

	if (!(a & 1) && !(b & 1)) 

		return kgcd(a>>1, b>>1) << 1;

	else if (!(b & 1)) 

		return kgcd(a, b>>1);

	else if (!(a & 1)) 

		return kgcd(a>>1, b);

	else return 

		kgcd(abs(a - b), min(a, b));

}

/*==================================================*\

|    GCD

|  x, y  gcd(a, b) = a * x + b * y;

\*==================================================*/

int extgcd(int a, int b, int & x, int & y)

{

	if (b == 0) 

	{ 

		x=1; y=0; 

		return a; 

	}

	int d = extgcd(b, a % b, x, y);

	

	int t = x; x = y; y = t - a / b * y;

	

	return d;

}

좋은 웹페이지 즐겨찾기