Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果c比b小得多,找到**b%c(a幂b模c)的最佳方法是什么?_Java_Algorithm_Math_Exponential_Integer Arithmetic - Fatal编程技术网

Java 如果c比b小得多,找到**b%c(a幂b模c)的最佳方法是什么?

Java 如果c比b小得多,找到**b%c(a幂b模c)的最佳方法是什么?,java,algorithm,math,exponential,integer-arithmetic,Java,Algorithm,Math,Exponential,Integer Arithmetic,我已经在java中为biginger尝试了modPow()函数。 但需要的时间太长了 我知道模乘,甚至是指数运算 但由于受到限制,我无法解决这个问题 a,b的值可以包含1000000个数字(这么大,不是吗)? 现在我想找到(a**b)%c。 作为第一步,我们可以做a=a%c。 但在这里,即使是b也是如此巨大 c=10^9+7尝试使用此功能。它使用一些JS引擎来计算任何东西。 将表达式作为字符串参数并运行它 private void calculateExpression(String exp){

我已经在java中为
biginger
尝试了
modPow()
函数。
但需要的时间太长了

我知道模乘,甚至是指数运算

但由于受到限制,我无法解决这个问题

a
b
的值可以包含
1000000
个数字(这么大,不是吗)? 现在我想找到
(a**b)%c
。 作为第一步,我们可以做
a=a%c
。 但在这里,即使是
b
也是如此巨大


c=10^9+7

尝试使用此功能。它使用一些JS引擎来计算任何东西。 将表达式作为字符串参数并运行它

private void calculateExpression(String exp){

    try {
        //calling a JS engine which helps us to calculate what we need
        ScriptEngineManager mgr = new ScriptEngineManager();
        ScriptEngine engine = mgr.getEngineByName("JavaScript");
        Object result = engine.eval(exp);

        //checking if we got any error
        if (result.toString().equals("Infinity") || result.toString().equals("NaN")){
            System.out.println("Can't divide with zero");
        }           
        else if (result != null){
            Double doubleResult = new Double("" + result);

            //checking if the result is an int value
            if ((doubleResult == Math.floor(doubleResult)) && !Double.isInfinite(doubleResult)) {
                text.setText("" + (doubleResult.longValue()));
            }
            else {
                //means that it's double value
                text.setText(result.toString());
            }
        }
    }
    catch (Exception e) { 
        e.printStackTrace();
    }
}

不确定在这种情况下TLE是什么?模幂运算的标准算法可以轻松处理百万位数的指数。这肯定不会是你用
b
@BrianJ做的最慢的事情:
modPow
不是已经有效地做到了吗?用哪种语言?Java还是C?或者两者都有?关于TLE的寓意:不要使用TLA。@thang:当然。看一看。由于
c
非常小,很容易分解,因此我们可以使用该定理来减小指数。在通用的
modPow
之后,函数很容易就足够快了。对不起,这显然太慢了。所以,即使它能在某个时候提供结果,那也太晚了。好吧,但它能提供你需要的解决方案吗?我不需要它。根据OP,直接的算法太慢了。看看评论,我暗示了正确的解决方案。欢迎您全部使用。