Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2017
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.01 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <conio.h>
  3.  
  4. void extended_euclid(unsigned __int64 x, unsigned __int64 y, __int64 &a, __int64 &b, unsigned __int64 &gcd){
  5.    
  6.     unsigned __int64 g=1;
  7.  
  8.     while (((x & 1)==0) && ((y & 1)==0)){
  9.         x=x/2;
  10.         y=y/2;
  11.         g=2*g;
  12.     };
  13.  
  14.     __int64 u=x;
  15.     __int64 v=y;
  16.     __int64 A=1;
  17.     __int64 B=0;
  18.     __int64 C=0;
  19.     __int64 D=1;
  20.  
  21.  
  22.     do{
  23.         while ((u & 1)==0){
  24.             u=u/2;
  25.  
  26.             if (((A-B) & 1) == 0){
  27.                 A=A/2;
  28.                 B=B/2;
  29.             } else {
  30.                 A=(A+y)/2;
  31.                 B=(B-x)/2;
  32.             }
  33.         };
  34.        
  35.         while ((v & 1)==0){
  36.             v=v/2;
  37.  
  38.             if (((C-D) & 1) ==0){
  39.                 C=C/2;
  40.                 D=D/2;
  41.             } else {
  42.                 C=(C+y)/2;
  43.                 D=(D-x)/2;
  44.             }
  45.         };
  46.  
  47.         if (u>=v){
  48.             u = u-v;
  49.             A = A-C;
  50.             B =B-D;
  51.         } else {
  52.             v=v-u;
  53.             C=C-A;
  54.             D=D-B;
  55.             };
  56.     }while (u!=0);
  57.  
  58.     a = C;
  59.     b = D;
  60.     gcd = g*v;
  61. }
  62.  
  63. void main()
  64. {
  65.     __int64 x = 693;
  66.     __int64 y = 609;
  67.     __int64 a,b;
  68.     unsigned __int64 gcd;
  69.  
  70.     extended_euclid(x,y,a,b,gcd);
  71.     printf("a = %I64d\n",a);
  72.     printf("b = %I64d\n",b);
  73.     printf("GCD: = %I64u",gcd);
  74.     getch();
  75. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement