Obliczenie odwrotności modulo w pętli dla zadanego m

0

Cześć.
Mam problem z napisaniem implementacji do poniższego algorytmu (nieliniowy generator odwrotności modulo):
7fc1bdaf96.png

Dla równania bez odwrotności modulo algorytm wygląda tak:

 int main()
{    
  unsigned long long m,a,c,x,x0;

  cin >> m >> a >> c >> x0;
  x = x0;
  do
  {
    x = (a * x + c) % m;
    cout << x << " ";
  } while(x != x0);
  cout << endl;
  return 0;
}  

Dokładniej nie bardzo wiem jak obliczyć odwrotność modulo dla zadanego m dla każdego z osobna x (wiem tylko, że najlepiej wykorzystać rozszerzony algorytm Euklidesa). Chciałbym to zrobić w osobnej funkcj, która na początku programu obliczyłaby odwrotności dla zadanego przez użytkownika m, i na podstawie tych wygenerowanych odwrotności wtedy będzie można policzyć Xn wg podanego wyżej kodu.
Czy ktoś może pomóc w rozwiązaniu tego problemu?

0

obliczyć NWD można z algorytmu:

int main()
{
int r, nwd, a, q, b;
int x, x1, x2;
int y, y1, y2;
int nwd_a, nwd_b;
 
//get all data
printf("Podaj pierwsza liczbe (x) \n");
scanf("%d", &nwd_a);
 
printf("Podaj druga liczbe (m)\n");
scanf("%d", &nwd_b);
 
// a must be greater than b
if (nwd_b > nwd_a)
{
nwd = nwd_b;
nwd_b = nwd_a;
nwd_a = nwd;
}
 
 
//initialize a and b
a = nwd_a;
b = nwd_b;
 
//initialize r and nwd
q = a/b;
r = a - q*b;
nwd = b;
 
//initialize x and y
x2 = 1;
x1 = 0;
y2 = 0;
y1 = 1;
x = 1;
y = y2 - (q-1)*y1;
 
while (r != 0)
{
a = b;
b = r;
 
x = x2 - q*x1;
x2 = x1;
x1 = x;
 
y = y2 - q*y1;
y2 = y1;
y1 = y;     
 
nwd = r;
q = a/b;
r = a - q*b;
}
 
//present results
printf("NWD(%d, %d) = %d = %d * %d + %d * %d\n", nwd_a, nwd_b, nwd, x, nwd_a, y, nwd_b);
 
if (nwd == 1)
printf("%d * %d mod %d = 1", nwd_b, y, nwd_a);
 
return 0;
} 

jednak nie wiem w jaki sposób mogę to wykonać w pętli dla m wyrazów. Czy ma ktoś na to pomysł?

1 użytkowników online, w tym zalogowanych: 0, gości: 1