Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cmath>
- #include <vector>
- #include <stack>
- using namespace std;
- bool diophant(long long a, long long b, long long c, long long &x, long long &y);
- int main()
- {
- long long n;
- cout << "Input N: ";
- // long long n = 1, p = 1;
- // while (p != 0) // Ввод n по множителям
- // {
- // n *= p;
- // cin >> p;
- // }
- cin >> n; //Ввод n целиком
- long long m = n;
- //Формирование вектора v из взаимнопростых множителей числа n:
- vector < long long > v;
- int c = 0; //Количество взаимнопростых множителей n
- for (long long i = 2; i <= n; ++i)
- if (n % i == 0)
- {
- c++;
- v.push_back(i);
- n /= i;
- while (n % i == 0)
- {
- n /= i;
- v.back() *= i;
- }
- }
- //Вывод на экран разложения n на взаимнопростые множители:
- n = m;
- cout << n << " = " << v.front();
- for (int i = 1; i < c; ++i)
- cout << "*" << v.at(i);
- cout << endl << "Idempotents: ";
- //Двоичный перебор всех вариантов представления n как n = a*b,
- //где НОД(a, b) = 1. При этом исключаем повторы
- long long limit = pow(2, c - 1), a, b, x, y, count = 0;
- for (long long i = 1; i < limit; ++i)
- {
- m = i;
- a = b = 1;
- for (long long j = 0; j < c; ++j)
- {
- if (m % 2 == 1)
- {
- a *= v.at(j);
- }
- else
- {
- b *= v.at(j);
- }
- m /= 2;
- }
- //Решаем составленное диофантово уранение ax + by = 1
- diophant(a, b, 1, x, y);
- x *= a; // ax - идемпотент в кольце вычетов Zn
- //Выбираем x именно из интервала [0 .. n-1]
- while (x < 0) x += n;
- while (x >= n) x -= n;
- //Выбираем парный ему идемпотент 1-x
- y = n + 1 - x;
- //Увеличиваем счетчик идемпотентов
- count += 2;
- //Выводим найденную пару идемпотентов
- cout << x << " " << y << " ";
- }
- //Выводим количество идемпотентов:
- cout << endl << "Count indempotents = " << count;
- }
- bool diophant(long long a, long long b, long long c, long long &x, long long &y)
- {
- stack < long long >q;
- long long r;
- while (a % b != 0)
- {
- r = a % b;
- q.push(a / b);
- a = b;
- b = r;
- }
- if (b != 1)
- {
- return false;
- }
- else
- {
- long long temp;
- x = 1;
- y = q.top();
- q.pop();
- while (!q.empty())
- {
- temp = x;
- x = -y;
- y = -temp - q.top() * y;
- q.pop();
- }
- x *= c;
- y *= -c;
- return true;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement