быстрое умножение двух массивов с n цифрами в c

Я попытался написать код умножения для огромных чисел. Проблема медленная. Я не мог выполнить в короткие сроки. В этом примере время выполнения составляет около 7 секунд. Я хочу это за одну секунду или меньше. Есть ли предложение по коду или какой-либо библиотеке, которая поможет мне в моей проблеме?

string multiply(string num1, string num2) 
{ 
    int len1 = num1.size(); 
    int len2 = num2.size(); 
    vector<int> result(len1 + len2, 0);  
    int i_n1 = 0;  
    int i_n2 = 0;  
    for (int i=len1-1; i>=0; i--) 
    { 
        int carry = 0; 
        int n1 = num1[i];
        i_n2 = 0;           
        for (int j=len2-1; j>=0; j--) 
        { 
            int n2 = num2[j] ; 
            int sum = n1*n2 + result[i_n1 + i_n2] + carry; 
            carry = sum/10; 
            result[i_n1 + i_n2] = sum % 10;  
            i_n2++; 
        } 
  
        if (carry > 0) 
            result[i_n1 + i_n2] += carry; 
        i_n1++; 
    }
    int i = result.size() - 1; 
    while (i>=0 && result[i] == 0) 
    i--; 
    if (i == -1) 
    return "0"; 
    string s = ""; 
      
    while (i >= 0) 
        s += std::to_string(result[i--]);   
    return s; 
}
main()
{
    string str1 ="";
    string str2 ="";
    for(int i=0;i<50000;i++)
    {
     str1+=to_string ((rand()%10));
     str2+=to_string ((rand()%10));\
    }
  clock_t t_star=clock();
  multiply(str1, str2);
  std::cout<<(double)((double)clock()-(double)t_star)/(double)CLOCKS_PER_SEC<<std::endl;
  system("pause");
}

person program_lover    schedule 04.02.2021    source источник
comment
Эта ссылка помогает? stackoverflow.com/questions/62441306/   -  person Telescope    schedule 04.02.2021
comment
Обратите внимание, что вы пропустили вызов srand.   -  person stark    schedule 04.02.2021
comment
убедитесь, что у вас включен оптимизатор.   -  person user4581301    schedule 04.02.2021
comment
Это не решает вопрос, но с этим кодом есть пара проблем. Во-первых, умножение N-значного числа на M-значное число может привести к числу с N+M+1 цифрами. Вектор result слишком мал. Во-вторых, содержимое двух объектов std::string, передаваемых в multiply, представляет собой все коды символов, а не цифры 0..10. Код в main преобразует случайно сгенерированные цифры в коды символов; '0' не то же самое, что 0. Мой совет — использовать для данных std::vector<int>, а не std::string, и не преобразовывать значения в текст.   -  person Pete Becker    schedule 04.02.2021
comment
Я перепробовал все указанные способы, но безрезультатно, но Thread не пробовал, потому что не знаю, куда его поместить, потому что процесс последовательного выполнения   -  person program_lover    schedule 04.02.2021
comment
теперь я пытаюсь опробовать некоторую библиотеку, какие-либо предложения   -  person program_lover    schedule 04.02.2021
comment
спасибо Телескоп. ссылка была полезна, я обнаружил, что ребята заменяют десятичную базу только на большую базу   -  person program_lover    schedule 04.02.2021
comment
см. Быстрое вычисление квадрата большого числа   -  person Spektre    schedule 04.02.2021
comment
Spektre ссылка, которую вы подняли, интересна, я пытаюсь ее запрограммировать и углубиться в нее, спасибо   -  person program_lover    schedule 04.02.2021
comment
Рассматривали ли вы возможность использования БПФ? Это самый быстрый известный метод умножения больших чисел. numbers.computation.free.fr/Constants/Algorithms/fft.html   -  person XylemFlow    schedule 05.02.2021
comment
Это зависит от того, насколько велики ваши числа. Для тысяч цифр БПФ является самым быстрым, но для 10 с или, может быть, сотен или цифр это, вероятно, метод, использующий: en .wikipedia.org/wiki/Karatsuba_algorithm   -  person XylemFlow    schedule 05.02.2021
comment
@XylemFlow 1. Умножение Шёнхаге-Штрассена на основе БПФ медленнее, чем умножение Шёнхаге-Штрассена на основе NTT 2. Умножение Шёнхаге-Штрассена не самый быстрый, сейчас есть немного более быстрые алгоритмы, также основанные на NTT/FTT   -  person Spektre    schedule 05.02.2021
comment
@XylemFlow см. это Еще более быстрое целочисленное умножение на странице 3 — это сравнение хорошо известные алгоритмы (я только что нашел за 3 секунды поиска в Google) ... однако более сложные алгоритмы обычно связаны с огромными накладными расходами, что означает, что их можно использовать только для действительно больших чисел ... поэтому лучше иметь больше реализаций и выбирать, какие использовать на основе по разрядности операндов.   -  person Spektre    schedule 05.02.2021