我完全没有理由写这段代码,只是觉得写起来很有趣。在空闲的时候,我想知道如何有效地从质数序列中计算出第n个质数,给定索引n。
是的,可以使用质数函数,它对于足够小的质数集来说是相当快的。但是质数本身并不能解决这个问题。质数返回小于或等于某个值的质数的整个列表。所以你可能会调用质数,却发现你生成的质数太少,无法得到你想要的特定质数。更糟的是,假设你想找到P(1e8)?生成包含100,000,000个质数的整个列表的效率非常低,只需要该列表的最后一个元素。
一个密切相关的问题是问有多少质数小于一个给定的值。我们可以通过numel(primes(K))来得到这个值,但是如果数字K非常大,可能大到2^32,那么对质数的调用将花费很长时间来执行。
n '函数有效地解决了这两个问题。例如,P(12345678)是什么?
nthprime (123456)
ans =
1632899
它是质数。
isprime (1632899)
ans =
1
此外,我们还可以验证它是完整素数序列中的第123456′个素数。
元素个数(质数(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
nth'是相当有效的。例如,小于2^27的质数有7603553个,但是计算这些质数的整个列表可能是一个很大的任务。如果出于某种原因,您只想知道列表上的最后一个质数,那么调用nthprime的代价远远小于计算整个列表的时间。
Tic,p =质数(2^27)
运行时间为4.517565秒。
Tic,plast = nthprime(7603553)
运行时间为0.003868秒。
最后,nthprime可以处理高达2^32的质数,而质数函数远远低于这个数字就会失效。2^32以下大概有2e8个质数。确切地说,我们可以用nthprime来告诉我们有多少个:
nthprime (2 ^ 32, 1)
ans =
203280221
因此,第二个参数允许我们指定nthprime的操作。调用nthprime(K,1)与numel(primes(K))相同。但当K值较大时,它的效率要高得多。
同样,我对这段代码没有任何目标,除了想知道如何解决问题本身,我没有理由编写它。代码使用一个相对较小的质数数据库来定位问题,然后在此基础上应用一个简单的质数筛选。
引用作为
约翰·迪里科(2022)。nthprime(//www.tianjin-qmedu.com/matlabcentral/fileexchange/27073-nthprime), MATLAB中央文件交换。检索.