2015-04-29 5 views
0

Я работаю над калькулятором, который вычисляет число только для другого числа. Это происходит с этим кодом:Вычислить мощность с помощью многопотоков

public BigInteger generate(long Power, long Base){ 

    BigInteger result = BigInteger.valueOf(Base), 
    a = BigInteger.valueOf(Base); 
    int j=0; 

    while(j!=Power-1){ 
     result = result.multiply(a); 
     j++; 
    } 

    return result; 
} 

Я хотел бы знать, есть ли какой-либо математический способ разделить этот тип вычисления в несколько потоков, так что моя программа будет вычислять такие вещи, как 987654321^987654321 гораздо быстрее. Мой процессор имеет 6 ядер, поэтому, если есть способ использовать их все сразу для этого, это было бы здорово.

+3

Без потоков: вы должны начать с преобразования a^b в (a^(b div 2))^2 * a^(b mod 2), если b достаточно велико. –

+2

Я бы начал использовать лучший алгоритм для возведения в степень одного потока, например [возведение в степень по квадрату] (http://en.wikipedia.org/wiki/Exponentiation_by_squaring) –

ответ

-1

Первое, что приходит на ум разложение, т.е. записать базовый номер в качестве продукта

Base = a_1 * ... * a_n 

, а затем вычислить a_i^b в отдельных потоках, и умножают результаты. Вам нужно какое-то вычислительное усилие для поиска факторизации, но я бы сначала проверил, достаточно ли числа «достаточно», чтобы беспокоиться о нескольких ядрах, и если они есть, начните с некоторых стандартных проверок, если возможна факторизация. Или просто разделите на первые 100 простых чисел, это не займет много времени.

Особенно, если число дофакторизовывается несколько раз от того же фактора, вы просто должны вычислить мощность один раз, т.е.

(24)^5 = (3*2*2*2)^5 = 3^5 * 2^5 * 2^5 * 2^5 

и поэтому вы вычислить r_1 = 3^5 и r_2 = 2^5, а затем умножить результат r = r_1 * r_2 * r_2 * r_2.

Вы также можете разложить экспоненты, но тогда алгоритм будет немного сложнее.

+2

* Первое, что приходит в голову, это факторизация * Ну, возможно если вы хотите ускорить расчеты, факторизация является известной трудной проблемой. Я бы хотел увидеть некоторые экспериментальные данные, чтобы убедить меня, что факторизация, как предварительный шаг, фактически приведет к более быстрому параллельному алгоритму. В отсутствие экспериментальных данных аргумент из первых принципов, основанный на вычислительных сложностях задействованных операций, был бы удовлетворительным. –

+2

Потому что превращение проблемы в P (возведение в степень) в проблему в BQP (целая факторизация) - это лучший способ ускорить процесс. И это был сарказм. –

+0

Несомненно, поиск простой факторизации сложный и гораздо более интенсивный. Но нахождение факторизации может быть довольно быстрым (как я уже упоминал, путем угадывания и зондирования), и поскольку это может сократить время всего вычисления в два раза или меньше (в зависимости от количества факторов и ядер/потоков), я все еще думаю время, полученное в среднем, велико. – EluciusFTW

Смежные вопросы