指数求模

指数幂求模

comupte aj mod pcomupte\ a^{j}\ mod \ pcomupte aj mod p

Formular

(pq) mod N = ((p mod N)*(q mod N)) mod N

at={a(aj/2)2j is odd number(aj/2)2j is even numbera^{t}=\left\{ \begin{aligned} a(a^{j/2})^{2}& & j \ is\ odd\ number\\ (a^{j/2})^{2} && j \ is \ even \ number \end{aligned} \right. at={a(aj/2)2(aj/2)2j is odd numberj is even number

Code Implementation

//
//  main.cpp
//  ModularExponent
//
//  Created by Ronald on 2018/10/16.
//  Copyright © 2018 Ronald. All rights reserved.
//

#include <iostream>
#include <stack>

using namespace std;

//compute a^j%p
int modular_exponent_re(int a,int j, int p){
    if(p<0){
        return -1;
    }
    if(j==0){
        return 1;
    }else{
        int z = modular_exponent_re(a, j/2, p);
        if(j%2==0){
            return ((z%p)*(z%p))%p;
        }else{
            return (a*(z%p)*(z%p))%p;
        }
    }
}

int modular_exponent(int a,int j,int p){
    if(j<0){
        return -1;
    }
    if(j==0){
        return 1;
    }else{
        stack<int> s;
        int result = a;
        while(j){
            s.push(j);
            j=j/2;
        }
        
        while (s.size()>1) {
            int t = s.top();
            s.pop();
            result = ((result%p)*(result%p))%p;
            if (s.empty()) {
                break;
            }
            if (t*2 != s.top()) {
                result = ((a%p)*result)%p;
            }
        }
        return result;
    }
}

int modular_exponent1(int a,int j,int p){
    if(j<0){
        return -1;
    }
    if(j==0){
        return 1;
    }else{
        int result = 1;
        
        while (j>0) {
             if (j%2!=0) {
                result = (a*result)%p;
            }
           // result = ((result%p)*(result%p))%p;
           //a=(a*a)%p
           a = a%p;
           a=(a*a)%p;
           j=j/2;
        }
        return result;
    }
}

s=1
if j is odd s=s*a
(a2)j/2(a^{2})^{j/2}(a2)j/2

int modular_exponent_trick(int a,int j,int p){
    int s = 1;
    while(j){
        if (j%2 != 0) {
            s = (s*a)%p;
        }
        a = (a*a)%p;
        j=j/2;
    }
    return s;
}

int main(int argc, const char * argv[]) {
    // insert code here...
    std::cout << "Hello, World!\n";
    std::cout << modular_exponent_re(3, 10, 31)<<endl;
    std::cout << modular_exponent(3, 10, 31)<<endl;
    std::cout << modular_exponent_trick(3, 10, 31)<<endl;
    return 0;
}

03-15
<think>嗯,用户想了解运算、运算、取余这些数学和计算机中的概念。首先,我需要先回忆一下这些术语的定义和区别。记得之前看过一些资料,说取和取余虽然类似,但在处理负数时会有不同结果。比如,引用[1]提到两者的区别在于商的取整方向不同,取余向0舍入,而取向负无穷舍入。这点很重要,可能在回答时要详细说明。 然后,用户还提到数学中的运算和计算机中的%运算符。需要明确数学中的运算是基于同余的概念,而计算机中的实现可能因语言而异。比如,在Python中,%运算符的行为更符合取,而C语言中的负数处理可能不同。这部分可能需要引用具体的例子,如引用[3]中的定理,说明正整数的情况,再扩展到负数。 接下来,用户可能需要知道运算的应用场景。比如,密码学中的RSA算法,散列函数,循环队列等。还有快速幂取,这在引用[4]中提到过,可以结合快速幂算法来解释如何高效计算大指数运算。 另外,用户可能对运算的基本性质感兴趣,比如分配律、结合律等。需要列出这些性质,并给出数学表达式,用$$...$$格式。例如,分配律:(a + b) mod m = [(a mod m) + (b mod m)] mod m。 还要注意区分运算和取余的不同,尤其是在处理负数时。例如,-7 mod 3在数学中是2,而取余可能是-1,但根据引用[1],取运算的商向负无穷舍入,所以这里应该得到2。需要举例说明,可能用表格来对比两种情况。 然后,用户可能想知道如何在编程中实现这些运算,不同语言的处理方式。比如Python中-7 % 3的结果是2,而C语言中可能是-1。这时候需要提醒用户注意语言特性,引用相关的资料,如引用[3]中的例子。 最后,生成相关的问题时,要覆盖定义、区别、应用、算法实现等,比如运算与取余的区别,负数的处理,快速幂的应用等。确保问题能引导用户进一步探索。</think>### 运算与取余运算详解 #### 1. **基本定义** - **运算(Modulo Operation)** 数学上,若$a$和$m$是整数且$m>0$,则$a \mod m$是满足$a = km + r$的非负整数$r$,其中$k$为整数,且$0 \leq r < m$[^3]。例如: $$13 \mod 3 = 1 \quad \text{(因为} \ 13 = 4 \times 3 + 1\text{)}$$ $$-7 \mod 3 = 2 \quad \text{(因为} \ -7 = (-3) \times 3 + 2\text{)}$$ - **取余运算(Remainder Operation)** 取余运算与取运算在正数时结果相同,但负数处理不同:商向0方向取整。例如: $$-7 \div 3 = -2.33 \rightarrow \text{商取-2(向0舍入)} \Rightarrow -7 \ \text{rem} \ 3 = -1$$ #### 2. **核心区别** | 运算类型 | 商取整方向 | 结果符号 | 示例(a=-7, m=3) | |----------|------------------|----------|--------------------| | 取 | 向负无穷(floor)| 同数m | $-7 \mod 3 = 2$ | | 取余 | 向0(fix) | 同被除数 | $-7 \ \text{rem} \ 3 = -1$ | 引用[^1]明确指出两者的差异源于商的取整方向不同。 #### 3. **数学性质** 运算满足以下性质(假设$a,b,m$为整数且$m>0$): 1. **加法分配律** $$(a + b) \mod m = [(a \mod m) + (b \mod m)] \mod m$$ 2. **乘法分配律** $$(a \times b) \mod m = [(a \mod m) \times (b \mod m)] \mod m$$ 3. **幂运算性质** 快速幂取算法(见引用[^4])利用此性质高效计算: $$a^n \mod m = (a^{n/2} \mod m)^2 \mod m \quad \text{(递归拆分)}$$ #### 4. **计算机中的实现** - **编程语言差异** - Python的`%`运算符是取运算:`-7 % 3 = 2` - C/C++/Java的`%`运算符是取余运算:`-7 % 3 = -1` #### 5. **应用场景** 1. **密码学** RSA加密算法依赖大数幂运算(快速幂取)[^4]。 2. **循环数据结构** 哈希表索引计算:`hash(key) % capacity`。 3. **时间与周期性计算** 如计算星期几:`(当前天数 + 偏移量) % 7`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值