哥德巴赫猜想在指定区间的证明python

这篇博客介绍了如何使用Python实现哥德巴赫猜想在指定区间的证明,包括素数判断子程序、哥德巴赫猜想的三层循环实现,以及主程序。同时,也探讨了Java版的角谷定理证明,展示了一个自然数迭代过程,直至达到1, 2或4的循环。文中强调了列表生成式和简化代码的重要性。" 84108914,7248495,小程序全局配置与页面配置详解,"['小程序开发', '微信小程序', '配置文件', '前端开发']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下为哥德巴赫猜想完整代码: 

def is_prime(num):
    cnt=0
    for i in range(2,num):
        if num%i==0:
            cnt+=1
            [1,num].append(i)
    if cnt==0:
        return num

def goldbach(num5):#goldbach conjecture:for {n∈N+|n∈(5,∞)},always have n=x+y+z(x,y,z are prime)
    lst2=[]
    lst=[is_prime(i) for i in range(2,num5) if is_prime(i)!=None]
    for k in range(len(lst)):
        conum=num5-lst[k]
        for n in range(len(lst)):
            if lst2!=[]:
                break
#一旦有一种三素数的组合方式就结束循环,因为可能这个数num5有多种素数组合的方式,我们只要一种就够了
            for m in range(len(lst)):
                if conum==lst[n]+lst[m]:
                    lst2=[lst[n],lst[m],lst[k]]
                    return lst2

lst3=[i for i in range(6,10)]#哥德巴赫证明范围
print({lst3[i]:list(map(goldbach,lst3))[i] for i in range(len(lst3))})

#运行结果:{6:[2,2,2],7:[2,3,2],8:[3,3,2],9:[2,5,2]}

整个代码分三部分,第一部分判断素数的子程序,第二部分是哥德巴赫猜想在指定区间的实现的子程序,最后是主程序。

其中goldbach()中有一个简单的思想方法,就是简化思想-把由三个素数组成的加和通过循环分解成两个(if conum== lst[n]+lst[m]),这样判断就更加的容易了

 另外,goldbach()子程序的第二行使用到了列表生成式,目的就是让代码更加简洁,其实他的真面目是:

lst=[]
for i in range(2,num5):
    if is_prime(i)!=None:
        lst.append(is_prime(i))

回到的哥德巴赫猜想实现程序,我在goldbach()中使用了三层for循环。虽然很费系统资源,但由于有人已经使用while循环证明了该猜想,我再用一次while就显得没必要。

最后一行打印字典生成式中使用到了map方法,即将goldbach()这个一次只能返回一个数的素数组合的子程序多次运行,直到lst3列表中所有元素都经过该子程序,并返回一个对象。举个例子吧:

def a(num):
    return num*2
lst=[1,2,3,4]
print(list(map(a,lst)))
#运行效果:
#打印列表:[2,4,6,8]

最后别忘了map返回的不是列表,所以如果想让他以列表呈现出来还要多加一步:list(...)

注:列表生成式有很多鬼畜的玩法,各式各样的。对于初学的朋友别忘了去学一下列表生成式,以后对写,简化,格式化代码很有帮助!


 附:角谷定理给定区间内证明其正确性python

# 角谷定理证明
def func(x):
    if x % 2 != 0:
        return x*3+1
    else:
        return round(x/2)
        
result3 = map(func, [i for i in range(2, 20)])  # 将func函数功能应用到lst中
for j in range(17):  # 迭代最少次数
    result3 = map(func, list(result3))
lst_Kakutani = list(result3)

print(lst_Kakutani)
for m in lst_Kakutani:
    if m != 1 and m != 4 and m != 2:
        print("迭代次数不够多或猜想不成立")
        break

#运行结果:[2,2,4,4,4,2,1,2,1,4,1,1,4,4,2,1,4,4]

角谷定理提出:给定任意自然数,若是偶数就除以二,若是奇数就乘三加一,一直这么迭代下去,最后该自然数会在1->2->4->1....这几个数中循环,也就是说如果该程序运行结果中显示的列表里面的数不是1,2就是4。若出现了其他数,一般说明可能迭代次数不够,第二可能就是定理错了。当然在该程序中,如果出现其他数,终端序会显示:“迭代次数不够多或猜想不成立”。所以就不用费力地观察了

该程序如何体现角谷定理的:在这个程序中,func()实现的是一个自然数的一次迭代,我们还需要多个自然数的一次迭代(line8-9),再到多个自然数的多次迭代(line11-12),且迭代次数有穷。

java 版角谷定理证明

package advance;

public class Kakutani {
	private int number;
	public static int cnt;

	public void setNumber(int number) {
		this.number = number;
	}

	public int iter1(int r) {
		if (r % 2 == 0) {
			return r / 2;
		} else {
			return r * 3 + 1;
		}
	}

	public int iter_n() {
		int result = this.iter1(this.number);//一次迭代的结果
		while (result != 1 && result != 2 && result != 4) {//有问题的部分:若角谷定理为假,则其是死循环
			result = this.iter1(result);
			cnt += 1;
		}
		return result;
	}

	public static void main(String[] args) {
		Kakutani num = new Kakutani();
		int randint = (int) (Math.random() * 100);
		num.setNumber(randint);// random number range=[0,100)
		int result = num.iter_n();//迭代完成的结果
		System.out.println("kakutani_func^" + cnt + "(" + randint + ") = " + result);

		if (result == 4 || result == 2 || result == 1) {
			System.out.print("kakutani thereom has been proofed!");
		} else {
			System.out.print("kakutani thereom is incorrect!");
		}
	}
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值