Java 使用多线程计算功耗

Java 使用多线程计算功耗,java,multithreading,algorithm,math,Java,Multithreading,Algorithm,Math,我正在研制一台计算器,它只计算一个数与另一个数的幂的乘积。此代码会发生这种情况: 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)

我正在研制一台计算器,它只计算一个数与另一个数的幂的乘积。此代码会发生这种情况:

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之类的内容。我的CPU有6个内核,所以如果有一种方法可以同时使用它们来做这些事情,那就太好了

首先想到的是因式分解,即将基数写成乘积

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


你也可以对指数进行因式分解,但这样算法会稍微复杂一些

没有线程:如果b足够大,你应该先将a^b转换成(a^(b div 2))^2*a^(b mod 2)。我会开始使用更好的算法进行单线程求幂,就像第一件想到的是因子分解。如果你想加快计算速度,也许不是这样。因子分解是一个已知的难题。我希望看到一些实验数据,让我相信,作为初步步骤,因子分解实际上会导致更快的并行算法。在没有实验数据的情况下,基于所涉及运算的计算复杂性的第一原理的论证是令人满意的。因为将P(指数化)中的问题转化为BQP(整数分解)中的问题肯定是加快速度的最佳方法。这真是讽刺。当然,找到素因子分解很难,而且计算量也大得多。但是找到一个因式分解可能非常快(就像我提到的,通过猜测和探索),而且由于这可能会将整个计算的时间减少一半或更少(取决于因子和内核/线程的数量),我仍然认为平均获得的时间是很大的。我并没有声称这是一个用更少的时间解决问题的算法,我提出了如何轻松地利用多线程。Ofc有时探测算法无法找到因素。在这种情况下,我们不使用多线程。这就是为什么与完整计算的预期时间相比,探测部分应该“小”的原因。不,整数分解,素数与否在BQP中,多项式时间算法未知。