电影里的代码之《机械姬》:筛法求质数

今天看了《机械姬》,探讨人工智能话题的电影,豆瓣评分7.5,还是蛮不错的一部电影。影片1:09:29处出现了一段python代码,细看了一下,发现是筛法求质数的python代码,写得非常简练的。先贴个电影的截图:

影片里的代码略微有点模糊,我重新打一遍,是下面这个样子的


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

#coding:utf8

import sys

def sieve(n):

    #compute primes using sieve eratosthenes

    = [1* n

    x[1= 0

    for in range(2,n/2):

        = 2 * i

        while j < n:

            x[j] = 0

            = + i

    return x

def prime(n,x):

    #Find nth prime

    = 1

    = 1

    while j <= n:

        if x[i] == 1:

            = + 1

        = + 1

    return i-1

= sieve(10000)

code = [1206,301,384,5]

key = [1,1,2,2]

sys.stdout.write("".join(chr(i) for in [73,83,66,78,32,61,22]))

for in range(0,4):

    sys.stdout.write(str(prime(code[i],x)-key[i]))

代码的最后打印出来下面这个很奇怪的东西,目测是一本书的ISBN,上豆瓣查了一下,是Embodiment and the Inner Life,是关于思维、意识的内容的,和本片的主题息息相关。


1

ISBN =9780199226559[Finished in 0.1s]

重点还是前面的两个函数实现的筛法求质数。首先介绍一下什么是筛法,筛法相传是古希腊的埃拉托斯特尼发明的一种检测素数的算法。筛法的思路非常简单,可以用下面的动图来描述。给定一个范围,首先用2去筛,把所有2的倍数都筛掉,然后再用3筛,用5筛,不断重复下去......

再来看代码


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

def sieve(n):             //对n以内的数进行筛选,返回一个长度为n的布尔数组

    #compute primes using sieve eratosthenes

    = [1* n         //定义长度为n的布尔数组(实际上电影里用10来表示true和false了)

    x[1= 0            //1既不是素数也不是合数,设为0

    for in range(2,n/2)://i从2开始一直到n/2

        = 2 * i    //j从2倍i开始

        while j < n:

            x[j] = 0  //把所有i的倍数筛除

            = + //下一个i的倍数

    return x          //返回数组

def prime(n,x):   //求第n个素数,只需要在筛选好的布尔数组中找第n个标记为1的数就可以了

    #Find nth prime

    = 1    //初始化为1

    = 1

    while j <= n:   //在布尔数组中寻找第n个标记为1的数

        if x[i] == 1:

            = + 1

        = + 1

    return i-1    //前面循环中i多加了一次,返回时需要减1

可以看到,使用筛法求第n个质数的时间复杂度为O(n),缺点在需要提前求得筛选的结果,增加了空间复杂度,筛选结果可以用比特位来表示以节省空间。

此外还有一个问题,在求第n个质数的时候,如何要确定第n个质数的大致范围,以确定筛选结果的布尔数组长度。根据素数定理,可以用来估算某个范围内的素数个数,可以用公式x/ln(x)来描述,ln表示自然对数,假设要估计10000以内有多少质数,代入公式10000/ln(10000)得到的结果为1085.73,使用上面的筛法得到的10000以为的质数个数为1229,可以看到估计值比实际值略小一点,估计的范围越大,估计值与实际值的误差越小。实际使用中可以通过公式计算估计值,然后按一定百分比扩大范围即可。

http://www.qytang.com/cn/list/28/611.htm
http://www.qytang.com/cn/list/28/610.htm
http://www.qytang.com/cn/list/28/595.htm
http://www.qytang.com/cn/list/28/583.htm
http://www.qytang.com/cn/list/28/582.htm
http://www.qytang.com/cn/list/28/576.htm
http://www.qytang.com/cn/list/28/523.htm
http://www.qytang.com/cn/list/28/499.htm
http://www.qytang.com/cn/list/28/488.htm
http://www.qytang.com/cn/list/28/466.htm
http://www.qytang.com/cn/list/28/463.htm
http://www.qytang.com/cn/list/28/458.htm
http://www.qytang.com/cn/list/28/455.htm
http://www.qytang.com/cn/list/28/447.htm
http://www.qytang.com/cn/list/28/446.htm
http://www.qytang.com/cn/list/28/445.htm

http://www.qytang.com

时间: 2024-10-07 06:32:55

电影里的代码之《机械姬》:筛法求质数的相关文章

【基础练习】埃拉托色尼筛法求质数

跑了一个质数表,哈希可能能用到 一开始跑的是0x3f3f3f3f以内,这个数等于1061109567 十亿多一点 结果什么软件也打不开那么大的文件 里奥说估计有一亿多个质数 于是换成一千万以内 跑出来了 代码放上 上次忘了古诗文···还是两句 --夜来风雨声,花落知多少 --有约不来过夜半,闲敲棋子落灯花 版权声明:转载请注明出处 [ametake版权所有]http://blog.csdn.net/ametake欢迎来看

利用筛法求质数

1 package algorithm; 2 //转载请注明 3 public class FilterPrime { 4 public static void filterPrime(int n) { 5 boolean[] isPrimes = new boolean[n+1]; 6 for(int i=2;i<=n;i++){ 7 isPrimes[i]=true; 8 } 9 isPrimes[2]=true; 10 for(int j=2;j<=n;j++){ 11 if(isPri

数论_筛法求素数

线筛,时间复杂度O(N log log N) 原理比较易懂,因为合数可以被分解为两个因数. 所以可以反过来,两个因数的乘积必定不是质数. 所以,通过一次次的枚举两个因数,合数就被"筛选"掉了,只留下质数在筛子里. 按照上述的原理,核心代码本应该是这样的: bool vis[MAXN] = {true, true, false}; for(i = 2; i <= N; i++) { for(j = 2; i*j <= N; j++) { vis[i*j] = true; //

UI设计教程分享:Ps合成炫酷机械姬

本次给大家分享一个通过PS合成一个炫酷的机械姬,在这个教程里给大家展示图像的色彩处理.人物光影塑造和创意实现及细节处理,教程比较简单,创意十足,看过<机械姬>电影的同学们一定知道这个有多炫酷,通过教程加上自己的融会贯通相信同学们可以做的更好,具体通过教程来学习一下吧. 效果图: 操作步骤: Step 1:纯色背景,做出两个渐变光源,我用的是形状羽化 Step 2:抠出女孩,建议还是用钢笔配合选择并遮住,并用动作磨皮将女孩快速磨皮处理 Step 3:女孩调色,女孩肤色偏黄偏暗,我们这里想要得到的

《机械姬》探讨人工智能 艾娃有可能会有个人意识

<人造意识>(Ex Machina,或译为<机械姬>)是部十分出色的电影,撇除电影巧妙地将一个极为深刻的哲学问题以故事方式呈现之外,配乐.镜头.演员.节奏.结局也是一绝的.这部电影的故事十分简单,主要角色只有三个:测试设计者(老板).测试者(员工,Caleb Smith,下称嘉立).被测试者(人工智能,Ava,下称艾娃).故事就是一间科技公司老板请来了一位员工,去帮忙测试他研发的人工智能.老板想要知道的事情很简单:究竟艾娃是否具有意识?电影版本图灵测试这个测试,一如老板所说,是个新

机械姬

电影<机械姬>,讲述了机器人Ava将自己的创造者Nasen博士杀死,然后逃出密室的故事. 影片中的Ava已经有了一定的人类思维,会撒谎,会调情,会思考...... 人类看到被自己创造出来的机器人亲手杀死,是否会引起一定的恐慌呢? 许多年以后,能通过图灵测试的机器人,是否真的能像影片中所设想的那样,可以像人类一样思考和行动,甚至在某些方面还能超过人类呢?

设置word里的代码格式,使之有底纹的效果

目录 1????实现效果:????1 2????怎么才能在word里实现这样的显示?????1 如何设置word里的代码格式,使之有底纹的效果????2 ? ? 实现效果: 怎么才能在word里实现这样的显示? 如何设置word里的代码格式,使之有底纹的效果 ?

VS2008里的代码如何格式化

选中要格式化的代码, 先按Ctrl+K 再按Ctrl+F 从菜单中也可以 "编辑"->"高级"->"设置文档的格式Ctrl+K Ctrl+D" 或者 "编辑"->"高级"->"设置选定内容的格式Ctrl+K Ctrl+F" VS2008里的代码如何格式化

Eclipse里的代码光标变成一个黑色块

以前经常在编写程序是不知到碰到键盘上的那个键了,或是那几个组合键了,使得Eclipse里的代码光标变成一个黑色块:在这个状态下,光标不在活动自如,只能一直往后写代码,就不想平时的 " | " 光标那样灵活了,要是在一个一行代码中间写就会把后面的代码覆盖而不是之前的 插入代码状态.是否也有同事们遇到过同样的事件呀. 其实这是键盘上的 Ins 键或 Insert 键,这是同一个键,不同键盘显示有差异. 原文地址:https://www.cnblogs.com/liaohongwei/p/9