验证任意大于5的奇数可表示为3个素数之和(哥德巴赫猜想其一)java实现

import java.util.*;
//小小兴趣。。。见笑了。。。
//哥德巴赫猜想,任何一个大于5的奇数可表示为3个素数之和
public class Goldbach_Conjecture {
	public static void main(String[] args){
		int n;
//不考虑程序的健壮性,这里默认输入为比5大的奇数
		Scanner s=new Scanner(System.in);
		n=s.nextInt();
		int[] arr=getRes(n);
		for(int i=0;i<arr.length;i++){
			for(int j=0;j<arr.length;j++){
				for(int k=0;k<arr.length;k++){
					if(arr[i]+arr[j]+arr[k]==n)
						System.out.println(n+"="+arr[i]+"+"+arr[j]+"+"+arr[k]);
				}
			}
		}
	}
//写出一个返回list的函数,利用list的可变长度,用来保存比输入的数小的所有素数的list集合
	public static int[] getRes(int n){
		ArrayList<Integer> l=new ArrayList<>();
		l.add(1);
		for(int i=1;i<n;i++){
			int count=0;
			for(int j=1;j<n-1;j++){
				if(i%j==0){
					count++;
				}
			}
			if(count==2){
				l.add(i);
			}
		}
		int arr[]=new int[l.size()];
		for(int i=0;i<l.size();i++){
			arr[i]=l.get(i);
		}
		return arr;
	}
}

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
验证哥德巴赫猜想2需要枚举所有的可能情况,因此需要使用一些算法优化。 以下是使用 Miller-Rabin 素性测试和 Pollard-Rho 因子分解算法实现的代码: ```python import random def is_prime(n, k=50): """Miller-Rabin素性测试""" if n < 2: return False if n == 2 or n == 3: return True if n % 2 == 0: return False r, s = 0, n - 1 while s % 2 == 0: r += 1 s //= 2 for _ in range(k): a = random.randint(2, n - 2) x = pow(a, s, n) if x == 1 or x == n - 1: continue for _ in range(r - 1): x = pow(x, 2, n) if x == n - 1: break else: return False return True def pollard_rho(n): """Pollard-Rho因子分解""" if n % 2 == 0: return 2 x = random.randint(1, n - 1) c = random.randint(1, n - 1) y = x d = 1 while d == 1: x = (pow(x, 2, n) + c) % n y = (pow(y, 2, n) + c) % n y = (pow(y, 2, n) + c) % n d = gcd(abs(x - y), n) if d == n: return pollard_rho(n) return d def gcd(a, b): """求最大公约数""" while b: a, b = b, a % b return a def find_prime_factors(n): """分解质因数""" factors = [] while n > 1: if is_prime(n): factors.append(n) break else: factor = pollard_rho(n) factors.extend(find_prime_factors(factor)) n //= factor return factors def find_prime_sum(n): """寻找三个素数之和""" if n < 7 or n % 2 == 0: return None for i in range(2, n - 4): if is_prime(i) and is_prime(n - i - 2): return (2, i, n - i - 2) factors = find_prime_factors(n - 4) for i in range(len(factors)): for j in range(i, len(factors)): if is_prime(n - factors[i] - factors[j]): return (factors[i], factors[j], n - factors[i] - factors[j]) return None # 测试 n = 99999991 sum = find_prime_sum(n) if sum: print("{} = {} + {} + {}".format(n, sum[0], sum[1], sum[2])) else: print("无法拆分成三个素数之和") ``` 这里的 `is_prime` 函数使用了 Miller-Rabin 素性测试,可以在 $O(k\log^3n)$ 的时间内判断一个数是否为素数,其 $k$ 是测试次数,一般取 50 左右。 `pollard_rho` 函数使用了 Pollard-Rho 因子分解算法,可以在 $O(\sqrt[4]{n})$ 的时间内分解一个合数,其 $\sqrt[4]{n}$ 是 $n$ 的四次方根。 `find_prime_factors` 函数使用了 Pollard-Rho 因子分解算法,可以在 $O(\sqrt[4]{n}\log n)$ 的时间内分解一个合数。 `find_prime_sum` 函数先枚举 $2$ 到 $n-4$ 之间的素数 $p$,再判断 $n-p-2$ 是否为素数。如果不存在这样的素数,则使用 Pollard-Rho 因子分解算法分解 $n-4$,然后枚举所有可能的两个因子 $a$ 和 $b$,再判断 $n-a-b$ 是否为素数。如果都无法拆分成三个素数之和,则返回 `None`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值