首页 > 编程语言 >模幂运算-要求算法返回幂运算a^b的计算结果与1337取模后的结果

模幂运算-要求算法返回幂运算a^b的计算结果与1337取模后的结果

时间:2024-08-21 13:15:12浏览次数:13  
标签:取模 运算 b% int 1337 base public blockingDeque

题目:模幂运算-要求算法返回幂运算a^b的计算结果与1337取模后的结果

其中b是一个非常大的数,所以b使用数组形式表示。即无法直接a^b%1337计算

此类问题的关键需要分治,拆分成更小规模的计算

1)对于a^b,如果b=1234,则a^1234 = a^4 *(a^123)^10

即a^b可以拆分后递归运算

2)对于取模运算,(a*b)%k= (a%k)*(b%k)%k

证明a=Ak +B,b=Ck+D

则a*b = ACk^2+ADk+BCk+BD

则a*b%k= BD%k=(a%k)*(b%k)%k

所以上述问题,a^1234方如果数值比较大,则可以a%k * a^1233 ,递归算出所有的

所以算法为

/**
 * a的【1,2,3】幂次方取余数1337,计算  其中【1,2,3】可以无限大
 */
public class Power {

    /**
     * a的【1,2,3】幂次方取余数1337,计算  其中【1,2,3】可以无限大
     * @param args
     * @throws InterruptedException
     */

    public static void main(String[] args) throws InterruptedException {
        BlockingDeque<Integer> blockingDeque = new LinkedBlockingDeque<>();
        blockingDeque.add(1);
        blockingDeque.add(2);
        blockingDeque.add(3);
        int a = 2;
        //1) a^[1,2,3] = a^3 * (a^[1,2])^10
        //2) a*b%c = (a%c)*(b%c)%c
        int i = superPower(a, blockingDeque);
        System.out.println(i);

    }


    public static int superPower(int a, BlockingDeque<Integer> blockingDeque) throws InterruptedException {
        if(blockingDeque.isEmpty()){
            return 1;
        }
        int last = blockingDeque.takeLast();
        int base = 1337;
        int part1 = myPower(a,last,base);
        int part2 = myPower(superPower(a,blockingDeque),10,base);
        return (part1*part2)%base;
    }


    public static int myPower(int a,int k,int base){
        a = a % base;
        int res = 1;
        for(int i=0;i<k;i++){
            res = res * a;
            res = res % base;
        }
        return res;
    }

  

3)幂运算仍可以进一步优化

即a^b = a * a^b-1  b为奇数, = (a^(b/2))^2

则可以进一步优化为

import java.util.concurrent.BlockingDeque;
import java.util.concurrent.LinkedBlockingDeque;

/**
 * a的【1,2,3】幂次方取余数1337,计算  其中【1,2,3】可以无限大
 */
public class Power2 {

    /**
     * a的【1,2,3】幂次方取余数1337,计算  其中【1,2,3】可以无限大
     * @param args
     * @throws InterruptedException
     */

    public static void main(String[] args) throws InterruptedException {
        BlockingDeque<Integer> blockingDeque = new LinkedBlockingDeque<>();
        blockingDeque.add(1);
        blockingDeque.add(2);
        blockingDeque.add(3);
        int a = 2;
        //1) a^[1,2,3] = a^3 * (a^[1,2])^10
        //2) a*b%c = (a%c)*(b%c)%c
        // 3) a^k =
        //        // 3.1) (a^[k/2])^2
        //        // 3.2) a * a^[k-1]
        int i = superPower2(a, blockingDeque);
        System.out.println(i);
        Double res = Math.pow(a,123)%1337;
        String s = String.valueOf(res);
        System.out.println(s.substring(0,s.length()-2));

    }


    public static int superPower2(int a, BlockingDeque<Integer> blockingDeque) throws InterruptedException {

        if(blockingDeque.isEmpty()){
            return 1;
        }
        int last = blockingDeque.takeLast();
        int base = 1337;
        int part1 = myPower2(a,last,base);
        int part2 = myPower2(superPower2(a,blockingDeque),10,base);
        return (part1*part2)%base;
    }


    public static int myPower2(int a,int k,int base){
        if(k==0){
            return 1;
        }
        a = a % base;
        if(1 == k%2){
            return (a*myPower2(a,k-1,base))%base;
        }else{
            int res = myPower2(a, k / 2, base);
            return (res*res)%base;
        }
    }
}

  

标签:取模,运算,b%,int,1337,base,public,blockingDeque
From: https://www.cnblogs.com/yangh2016/p/18371396

相关文章

  • C++运算符优先级
    优先级操作符描述例子结合性1()[]->.::++--调节优先级的括号操作符数组下标访问操作符通过指向对象的指针访问成员的操作符通过对象本身访问成员的操作符作用域操作符后置自增操作符后置自减操作符(a+b)/4;array[4]=2;ptr->age=34;obj.age=34;Class::ag......
  • Swift中的强大构建块:自定义运算符全解析
    标题:Swift中的强大构建块:自定义运算符全解析在Swift编程语言中,运算符是执行操作的一种快捷方式,它们可以用于简单的数学计算,也可以用于复杂的逻辑处理。Swift不仅提供了丰富的内置运算符,还允许开发者定义自己的运算符,以适应特定的编程需求。本文将深入探讨如何在Swift中实现......
  • 计算机的信息编码和基本运算
    UpdateData\(\mathrm{Update}\2024.8.19\):因为\(\KaTeX\)打不出异或及逻辑与的符号,所以用单行代码块来代替,如^,&&等。4.计算机的信息编码和基本运算4.1计算机的信息编码4.1.1ASCII码ASCII码,即美国标准信息交换吗,用于表示常见的英文字母,数字和常用符号。ASCI......
  • SHELL运算符
    Shell基本运算符Shell和其他编程语言一样,支持多种运算符,包括:算数运算符关系运算符布尔运算符字符串运算符文件测试运算符原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如awk和expr,expr最常用。expr是一款表达式计算工具,使用它能完成表达式的求值操......
  • SHELL之数值运算
    【四则运算符号】表达式举例$(())echo$((1+1))$[]echo$[10-5]exprexpr10/5(运算符左右有空格)letn=1;letn+=1等价于letn=n+1一、整数运算1、基本运算类别加法:+减法:-乘法:*整除:/取余数:%2、expr运算工具加法:+减法:-乘法:*整除:/取......
  • 逻辑运算符
    逻辑运算符&&||!packageoperator;/***@version:javaversion1.8*@Author:MrTheroux*@description:*@date:2024-08-209:33*/publicclassDemo05{publicstaticvoidmain(String[]args){booleana=true;booleanb......
  • 【数据结构与算法第一章】编程基础:变量与数据类型、指针、结构体、数组与链表、程序结
    目录【数据结构与算法第一章】编程基础1.1变量与数据类型1.2指针1.3结构体1.4数组和链表1.5程序结构1.6函数中参数的传递1.7C语言中运算符的含义【数据结构与算法第一章】编程基础1.1变量与数据类型变量:    ①在C语言中,所有变量必须先声明后使用......
  • C++运算符重载
    文章目录一、运算符重载1、规定2、operator关键词的使用二、赋值运算符的重载1、功能2、使用一、运算符重载1、规定C++允许我们对类类型使用运算符,但要我们自己通过运算符重载完成类类型的运算,如果没有对应的运算符重载就会报错。运算符重载需要使用特殊关键词......
  • Oracle运算符:从等号到空值运算的使用技巧
    在Oracle数据库中,关系运算符和逻辑运算符用于在SQL查询中定义条件。1.等号(=)运算符作用:用于精确匹配字段的值。适用场景:适用于比较数值、字符串、日期等数据类型,要求条件严格相等。例子:SELECTename,salFROMempWHEREdeptno=10;查询部门编号为10的所有员工姓名和......
  • 基本运算符
    基本运算符packageoperator;/***@version:javaversion1.8*@Author:MrTheroux*@description:*@date:2024-08-1917:06*/publicclassDemo01{publicstaticvoidmain(String[]args){inta=10;intb=20;intc=......