Разложение числа на множители

259
07 февраля 2018, 13:27

Всем привет, надо разложить число на множители(определенные). С маленькими числами все работает. Как пытаюсь работать с большими не получается. Код такой:

   #include <iostream>
#include <vector>
#include <random>
using namespace std;
__int64 powmod(__int64 a, __int64 b, __int64 m) {
    unsigned __int64 res = 1;
    while (b > 0)
        if (b & 1) {
            res = (res * a) % m;
            --b;
        }
        else {
            a = (a * a) % m;
            b >>= 1;
        }
        return res % m;
}
void algorithm(__int64 a, __int64 b, __int64 p)
{
    random_device rd;
    mt19937 gen(rd());
    uniform_int_distribution <unsigned long long> dis(1, p);
    __int64 n = 11;
    vector<__int64> vector1(n);
    __int64 **mas = new __int64 *[n];
    __int64 r = 0;
    __int64 e = n - 1;
    __int64 s = 1;
    vector1[0] = 2;
    vector1[1] = 3;
    vector1[2] = 5;
    vector1[3] = 7;
    vector1[4] = 11;
    vector1[5] = 13;
    vector1[6] = 17;
    vector1[7] = 19;
    vector1[8] = 23;
    vector1[9] = 29;
    vector1[10] = 31;
    for (__int64 i = 0; i < n; i++)
        mas[i] = new __int64[n];

    for (__int64 i = 0; i < n; i++)
        for (__int64 j = 0; j < n; j++)
            mas[i][j] = 0;
    //выбор элемента, который еще не встречался
    for (__int64 i = 0; i < n; i++)
    {
        do
        {
            s = dis(gen);
            //возведение в степень и разложение числа
            r = powmod(a, s, p);
            while (e != -1)
            {
                if (r%vector1[e] == 0)
                {
                    r /= vector1[e];
                    mas[i][e]++;
                }
                else
                    e--;
            }
    if(r!=1)
        i--;
    e = n-1;
        } while (r != 1);
    }
}
        void main()
        {
            algorithm(5, 43, 1073676287);
        }

Значение s меняется рандомно, если не разложилось, то меняем значение s и снова пробуем разложить, здесь это не указано. Само разложение идет в цикле while. Если взять модуль 503, то все отлично работает. Если больше, то он не может. В чем проблема?

READ ALSO
Как Отловить вызов функции mono

Как Отловить вызов функции mono

Возможно ли присечь вызовы функций

258
Поощрите лентяя, а то попробовал свой код написать ничего не выходит( [требует правки]

Поощрите лентяя, а то попробовал свой код написать ничего не выходит( [требует правки]

Оценки, полученные спортсменом в соревнованиях по фигурному катанию (в баллах), хранятся в массиве из 18 элементовВ первых шести элементах...

166
Генератор карт в консоли, с ASCII симолами - C++

Генератор карт в консоли, с ASCII симолами - C++

Сделал свой первый небольшой, но интересный проект, генератор карт в консолиГенератор генерирует комнаты и коридоры, которые соединяют эти...

251
XML-RPC распарсивание

XML-RPC распарсивание

Помогите, пожалуйста, распарсить сообщениеПробовал через Node и NodeList, но код слишком получался объемным и трудночитаемым

172