///************************************
///Kryptografia 5 *********************
///************************************
#include <iostream>
#include <cmath>
#include <vector>
#include <ctime>
#include <cstdlib>
using namespace std;
unsigned long long *tab;
//rozklad na czynniki pierwsze (faktoryzacja)
void rozklad_Fermata(unsigned int k)
{
unsigned long x, y, r, u, n;
x = (unsigned long)(sqrt(k));
do
{
r = x * x - k;
y = (unsigned long)floor(sqrt(r));
if (r == y * y)
{
u = x + y;
n = x - y;
if (n == 1)
break;
rozklad_Fermata(u);
rozklad_Fermata(n);
return;
}
x++;
} while (x + y < k);
// cout << k << "\n";
tab[k]++;
}
int potegowanie_modulo(int a, int b, int m) //funkcja sprawdzania czy liczba jest pierwasza
{
int i, result = 1;
long int x = a % m;
for (i = 1; i <= b; i <<= 1)
{
x %= m;
if ((b & i) != 0)
{
result *= x;
result %= m;
}
x *= x;
}
return result % m;
}
int main(void)
{
unsigned long long number, j, a, k;
bool czy_pierwsza = true;
tab = new unsigned long long[number]; //przydzielenie nowego bloku pamieci dla tablicy
cout << "Podaj liczbe do sprawdzenia: ";
cin >> number;
for (j = 0; j < number; j++) {
tab[j] = 0;
}
k = number - 1;
////// dopoki reszta z dzielenia przez 2 jest rowna 0 ////////////
while (k % 2 == 0)
{
k >>= 1;
tab[2]++;
}
if (k > 1)
rozklad_Fermata(k);
/////////// potegi /////////////////////
cout << "Nasze potegi to: \n";
for (j = 0; j < number; j++)
{
if (tab[j] > 0)
{
cout << j << "^" << tab[j] << endl;
}
}
/////////////// dziekniki ///////////
cout << "Nasze dzielniki to: \n";
for (j = 0; j < number; j++)
{
if (tab[j] > 0)
{
cout << j << endl;
}
}
/////// krotnosci ////////////////
cout << "Nasze krotnosci to: \n";
for (j = 0; j < number; j++) {
if (tab[j] > 0)
{
cout << tab[j] << endl;
}
}
/* cout << "Podaj cyfre lub liczbe z przedzialu <2," << number - 1 << ">" << endl;
cin >> a;
//sprawdzenie pierwszosci
if (potegowanie_modulo(a, number - 1, number) != 1)
czy_pierwsza = false;
for (j = 0; j < k; j++)
{
if (tab[j] > 0)
{
unsigned long long x = potegowanie_modulo(a, (number - 1) / j, number);
cout << j << endl;
if (potegowanie_modulo(a, (number - 1) / j, number) == 1)
czy_pierwsza = false;
}
}
if (czy_pierwsza == true)
{
cout << "Liczba " << number << " jest pierwsza." << endl;
}
else
{
cout << "Liczba " << number << " jest zlozona." << endl;
}
*/
system("pause");
return 0;
}