数论总结(Finally)

这篇博客总结了数论中的重要概念,包括Java实现的回文数判断、快速幂算法、分解质因数、整数的唯一分解定理、最大公约数和最小公倍数、质数判断、欧拉函数以及扩展欧几里得算法。还讨论了如何使用这些算法解决实际问题,如大数取模、质因数分解等。
摘要由CSDN通过智能技术生成

1,回文数:

判断回文数最快的方法可以考虑将数字的前一半和后一半进行比较,如果相等就说明该数字是回文数。

具体地,我们可以将整数转成字符串,然后使用双指针法判断字符串是否是回文的。

下面是一个 Java 实现:

public boolean isPalindrome(int x) {
    String s = String.valueOf(x);
    int i = 0, j = s.length() - 1;
    while (i < j) {
        if (s.charAt(i) != s.charAt(j)) {
            return false;
        }
        i++;
        j--;
    }
    return true;
}


这个方法的时间复杂度为 $O(n)$,其中 $n$ 是输入数字的位数。如果要进一步优化时间复杂度,可以直接在数字上进行操作,而不用转成字符串,具体实现方法见我的另一个回答。

也可以用StringBuilder里面的reverse方法和原方法进行比较 , 当然如果字符串较长 不建议使用;

2,快速幂

快速幂是指通过对幂运算的指数进行二进制拆分,从而将幂运算的时间复杂度降低到 $O(\log n)$ 的算法。在取模意义下进行快速幂运算,常常被用来解决大数取模问题。

Java 实现的快速幂模板如下:

public static long quickPow(long a, long b, long mod) {
    long res = 1;
    while (b > 0) {
        if ((b & 1) == 1) {
            res = res * a % mod;
        }
        a = a * a % mod;
        b >>= 1;
    }
    return res;
}


其中,参数 a 表示底数,b 表示指数,mod 表示模数。函数返回底数 a 的指数 b 次方取模 mod 的结果。这里使用了位运算来实现二进制拆分。

例如,在计算 $a^b\ \mathrm{mod}\ m$ 的时候,可以调用 quickPow(a, b, m) 函数,并将其返回值作为结果即可。

例题1:  幂幂

问题描述

  给出a,b,c。令p=1000000007, z=b^c, y=a^z, x=y mod p。请求出x。

输入格式

  三个整数分别是a,b,c

输出格式

  请输出x

样例输入

2 2 2

样例输出

16

数据规模和约定

  abc都不超过10^9

Java代码如下:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        int b = sc.nextInt();
        int c = sc.nextInt();
        int p = 1000000007;
        long z = quickPow(b, c, p - 1);
        long y = quickPow(a, z, p);
        System.out.println(y);
    }

    // 快速幂算法
    public static long quickPow(long x, long n, int mod) {
        long res = 1;
        while (n > 0) {
            if (n % 2 == 1) {
                res = res * x % mod;
            }
            x = x * x % mod;
            n /= 2;
        }
        return res;
    }
}

步骤解析:

1. 首先输入a、b、c三个数和模数p。
2. 计算z=b^c mod (p-1),其中(p-1)是因为根据费马小定理,a^(p-1)=1(mod p),因此a^z的值只与z模(p-1)的余数有关。
3. 计算y=a^z mod p,这里可以直接调用快速幂算法,以提高计算效率。
4. 输出x=y。

需要注意的是,对于较大的整数求幂时,需要使用快速幂算法以降低时间复杂度。此外,在计算完乘积后需要及时取模避免溢出。


例题2 : 快速幂

package 算法提高;

import java.util.Scanner;

public class 快速幂002 {


	    
	    public static 
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值