迎1024程序员节,说质数与哥德巴赫猜想(上)
Python数学编程第0讲 2020.10.17
1024程序员节的来历
1024,10月24日,是联合国日、世界发展信息日。
1024 = 2 x 2 x 2 x 2 x 2 x 2 x 2 x 2 x 2 x 2 = 2^10
1024,在计算机世界,有特殊的地位。大家熟悉的存储容量,1KB=1024字节,1兆(MB)=1024KB,1GB=1024MB,1TB=1024GB……10月24日,也成为了程序员节。
略谈少儿编程
国家层面,2018年,教育部印发《教育信息化2.0行动计划》(教技〔2018〕6号),提出“完善课程方案和课程标准,充实适应信息时代、智能时代发展需要的人工智能和编程课程内容。推动落实各级各类学校的信息技术课程,并将信息技术纳入初、高中学业水平考试。继续办好各类应用交流与推广活动,创新活动的内容和形式,全面提升学生信息素养”。2019年,教育部发布《关于加强和改进中小学实验教学的意见》(教基〔2019〕16号)。要求“2023年前要将实验操作纳入初中学业水平考试,考试成绩纳入高中阶段学校招生录取依据”,提出“注重加强实验教学与多学科融合教育、编程教育、创客教育、人工智能教育、社会实践等有机融合”。更不用说这几年的高考数学试卷,都出现了编程题。
小孩子学编程,学什么?
乔布斯曾在一次访谈中提出:“我觉得每个人都应该学习一门编程语言。学习编程教你如何思考,就像学法律一样学法律并不一定要为了做律师,但法律教你一种思考方式。学习编程也一样,我把计算机科学看成是教育,每个人都应该花至少1年时间学习编程。”
漂亮的代码、严格规范的语言风格、计算思维训练、动手能力都是编程教育的重要内容。
Python数学编程项目,让孩子将解决问题的思路、方法和手段转化为计算机理解的形式,并通过设置合理顺序的指令让计算机根据指令一步步工作,从而完成某项特定的任务。希望不仅能够培养孩子对数学、编程的兴趣,更培养孩子对世界的好奇心,换个角度看世界,从本质上理解软件、游戏等程序,更好地适应未来的科技社会。
认识计算机
现代社会,早已进入信息时代、人工智能时代,人们的生活,越来越离不开互联网、物联网,离不开计算机,各种设备里,都有计算机的身影。而计算机的运行,全靠软件来指挥。2014年,苹果公司全球开发者大会的宣传语就是“Write the Code. Change the World”,之后更是有“软件定义世界”的说法。
计算机那么能干,它真的比人聪明吗?
不,计算机是算得快、记得牢,但它其实只认识0和1,它如何行动,全是软件程序的安排,而这些软件程序,是人编写的。
计算机只认识0和1,那我们怎么教它动作呢?
早年的机器语言真的就是用0101来给它下指令 : (
这些穿孔纸带就是用指定位置是否有孔来代表0和1,把指令输入计算机中。
后来,人们创造了汇编语言,用简单的助记符代表指令。
再后来,人们又创造了更接近人类语言的高级语言。
Python学习环境
为什么我们要带大家用python来写程序呢?
用地产大佬潘石屹的话来说
要使用python,可以从官网下载软件安装。
安装后从开始菜单执行“Python”下的“IDLE”,即可使用python
让我们来试试python的数学运算:
加 + 减 - 乘 * 除 / 取商 // 模(取余数) % 幂(乘方) **
看看官网首页展示的简单输入输出例子:
# Python 3: Simple output (with Unicode)>>> print("Hello, I'm Python!") # print,输出函数Hello, I'm Python!# Input, assignment>>> name = input('What is your name?\n') # input,输入函数>>> print('Hi, %s.' % name)What is your name?PythonHi, Python.
教计算机判断质数
有一个人,他1996年就去世了,但在2009年建国60年人民英模、2018年改革开放40年杰出贡献人物、2019年建国70年最美奋斗者等评选中都榜上有名。他就是数学家陈景润,我们先看个短片。
《人民英模 哥德巴赫猜想第一人 陈景润》
质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数(规定1既不是质数也不是合数)。
质数在自然界、在人类生活中有很多神奇的应用。现代密码学就是以质数的特性为基础的,许多生物的生命周期是质数(单位为年),这样可以最大程度地减少碰见天敌的机会。
怎么判断一个数n是不是质数呢?
根据质数的定义,我们可以挨个从1到n,看看能不能整除n,统计因子的个数,如果只有两个,那n就是质数。
怎么生成1到n的数列呢?range函数,range(a,b) 会生成a到b-1的序列。
怎么取出序列里的数呢?for语句,for i in 序列: 可以依次取出序列里的项目,执行下一层的代码内容。
n = 9
range(1, n+1)
for i in range(1, n+1): # python用缩进来表示代码的层次,:表示下一行开始是下一层代码
print(i)
怎么判断n是否能被i整除呢?模运算,余数为0说明能整除
n = 9
i = 3
n % i
i = 2
n % i
怎么判断余数是不是0呢?比较运算
a = 30
b = 20
a > b # 大于
a < b # 小于
a == b # 相等
a >= b # 大于等于
a <= b # 小于等于
a != b # 不等于
if(a%2==0): # 如果为真则执行
print('%d是偶数' % a)
if(a%2==0): # 如果为真则执行
print('%d是偶数' % a)
else: # 否则执行
print('%d是奇数' % a)
看看组装起来的代码!
n = 100 # 设n为100
counter = 0 # 计数器counter清零
for i in range(1, n+1): # i依次从1……n取出一个数
if(n%i==0): # 如果i能整除n,计数器累加1
counter = counter + 1
if(counter==2): # 如果因数只有两个n就是质数,否则n是合数
print('%d是质数' % n)
else:
print('%d是合数' % n)
如果n很大,就要算好多次,程序运行时间很长。有没有更好的方法呢?大家回家后好好想想,下次我们再一起改进。
课后练习
据说数学王子高斯小时候,数学老师曾让他们计算1+2+3+4+5+6+……+100的得数,同学们都忙着挨个挨个地相加,只有高斯巧妙发现了快速计算的方法,很快就得出了结果。你能不能教计算机用这两种方法各算一下?