2015-01-28 3 views
-1

Я написал функцию умножения большого числа, и я хочу изменить ее для вычисления мощности больших чисел.Многократное большое число параллельно

ех: (2321313200000888)^25, так что я сделать так:

public string power(string num1, int n) 
{ 

    Stopwatch timer = new Stopwatch(); 
    timer.Start(); 
    string answer= num1; 
    for (int i = 1; i < n; i++) 
     answer= multiply(num1, answer); 

    if (this.InvokeRequired) 
    { 
     this.richTextBox1.BeginInvoke((MethodInvoker)delegate() { richTextBox1.Text = answer; }); 
     this.label6.BeginInvoke((MethodInvoker)delegate() { label6.Text = answer.Length.ToString(); }); 
     this.label2.BeginInvoke((MethodInvoker)delegate() { label2.Text = timer.Elapsed.ToString(); }); 

    } 


    return answer; 

Я хочу сделать это параллельно, чтобы сократить время, как я могу это сделать? Я попытался сделать задачу, но это то же самое, что и seqential.

+1

Что случилось с [BigNum.pow] (https://msdn.microsoft.com/en-us/library/system.numerics.biginteger.pow(v=vs.110).aspx)? И каков контекст? Вы много вычисляете эти экспонаты? Для какого приложения? – spirulence

+0

Вы не можете вычислить мощность, умножая ее параллельно, так как каждый результат зависит от предыдущего результата. В лучшем случае вы можете рекурсивно вычислять _pairs_ параллельно и продолжать, пока не останется только один номер. –

+1

Строгая арифметика всегда будет медленной ... – leppie

ответ

1

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

enter image description here

Так первый вычислительный (путем последовательного умножения с собой):

enter image description here

Тогда умножьте три требуемые. Это уменьшает от 24 умножений до 7 умножений. Сбережения довольно быстро растут для очень больших мощностей, хотя время меняется довольно сильно, в зависимости от того, сколько бит находится в мощности.

Вы обнаружите, что вы можете оптимизировать процесс, если вы в состоянии найти раздел таким образом, что у вас есть большие показатели только один раз, как и в:

enter image description here

+0

Я просто вытащил свои лекционные заметки написать именно то, что вы написали только сейчас. : D @MathJax: Когда они, наконец, представят это SO? Я имею в виду .. c'mon .. – displayname

+0

спасибо , поэтому я собираюсь написать рекурсивную силу, как вы упоминаете, и я ее парализую, но я думаю, потому что ответ всегда зависит от предыдущего результата, он не может быть парализован – arash

+0

Ну, вы можете вычислить «раздел», чтобы вы знали разные показатели. Эти разные вычисления будут распараллеливаться. Конечно, в конце концов вам придется объединить этот материал. Но иногда вы получите хорошие результаты. Я собираюсь добавить это к его ответу. – displayname