我完全没有理由写这段代码,除了写起来很有趣。在一个空闲的时刻,我想知道如何从素数序列有效地计算第n个素数,给定索引n。
是的,我们可以使用素数函数,它对于足够小的素数集是相当快的。但是质数本身并不能解决这个问题。素数返回小于或等于某个值的整个素数列表。所以你可能会调用质数,结果发现你生成的质数太少,无法得到你想要的特定质数。更糟的是,假设你想找到P(1e8)?生成包含100,000,000个质数的整个列表非常低效,只需要列表的最后一个元素。
一个与此密切相关的问题是,有多少质数小于给定值。我们可以用numel(质数(K))来表示,但如果K非常大,可能大到2^32,调用质数将会花费很长时间来执行。
n '函数有效地解决了这两个问题。例如,什么是P(12345678)?
nthprime (123456)
ans =
1632899
确保它是质数。
isprime (1632899)
ans =
1
我们还可以证明它是整个质数序列中的第1256个质数。
元素个数(质数(1632899))
ans =
123456
找出编号为[1 10 100 1000 10000 100000 1000000 10000000 100000000]的质数
p = nthprime (10 ^ (0:8))
p =
2 29 541 7919 104729 1299709 15485863 179424673 2038074743
Nthprime是相当有效的。例如,有7603553个小于2^27的质数,但计算这些质数的整个列表可能是一项艰巨的任务。如果出于某种原因,您只想知道列表上的最后一个素数,那么调用nthprime的代价远远小于计算整个列表的时间。
抽搐,p =质数(2 ^ 27);toc
运行时间为4.517565秒。
抽搐,体= nthprime (7603553); toc
运行时间为0.003868秒。
最后,nthprime可以处理高达2^32的质数,而质数函数在远低于这个数字时就失去了动力。2^32下面大约有2e8个质数。确切地说,我们可以用nthprime来告诉我们有多少个:
nthprime (2 ^ 32, 1)
ans =
203280221
因此,第二个参数允许我们指定nthprime的操作。调用nthprime(K,1)和numel(素数(K))是一样的。但是对于较大的K值,它更有效。
同样,对于这段代码,我没有任何目标,也没有编写它的理由,除了考虑如何解决问题本身。代码使用一个相对较小的质数数据库来定位问题,然后在此基础上应用一个简单的质数筛选。
引用作为
约翰D 'Errico(2021)。nthprime(//www.tatmou.com/matlabcentral/fileexchange/27073-nthprime), MATLAB中央文件交换。检索.