除了写作之外,我绝对没有理由写入这段代码。在闲散的时刻,我想知道,在给出索引n的情况下,如何从主要序列中有效地计算N'th素数。
是的,可以使用Primes功能,这对于小的足够纤维素套装来说是合理的。但自身的素质并没有解决这个问题。Primes返回小于或等于某个值的Primes列表。因此,您可能会调用Primes,只能为您生成太少的素数来获取您想要的特定素数。更糟糕,假设你想找到p(1e8)?生成100,000,000个素数的整个列表是非常低效的,只需要该列表的最后一个元素。
密切相关的问题是询问多少次素数低于给定值。我们可以通过NUMEL获得这一点(PRIMES(k)),但如果数字k非常大,可能是大约2 ^ 32,对媒体的呼叫将需要太长时间才能执行。
nthprime函数有效解决了这些问题。例如,什么是p(12345678)?
nthprime(123456)
ans =.
1632899.
看到它是素数。
Isprime(1632899)
ans =.
1
此外,我们可以验证它是完整的素数序列中的123456的素数。
numel(Primes(1632899))
ans =.
123456.
找到素数编号[1 10 100 1000 10000 100000百万千万亿]
p = nthprime(10. ^(0:8))
P =
2 29 541 7919 104729 1299709 15485863 17942463 179424673 2038074743
nthprime是相当高的。例如,有7603553的素数小于2 ^ 27,但计算这些素线的整个列表可能是一个大的任务。如果由于某种原因,您只想知道该列表的最后一个素数,调用nthprime的成本远远不到计算整个列表的时间。
tic,p = primes(2 ^ 27); toc
经过时间为4.517565秒。
Tic,Plast = nthprime(7603553); TOC
经过时间为0.003868秒。
最后,Nthprime可以使用高达2 ^ 32的素线,而Primes函数远远低于该数字的蒸汽。大约有2E8的素数低于2 ^ 32。确切地说,我们可以使用nthprime告诉我们有多少:
nthprime(2 ^ 32,1)
ans =.
203280221.
因此,第二个参数允许我们指定nthprime的操作。调用nthprime(k,1)与numel相同(Primes(k))。但对于k的大值而言,它更有效。
再次,我绝对没有这个代码的目标,没有理由写入它,除了解决我如何解决问题本身。代码是使用相对较小的primes数据库编写的,以本地化问题,然后它应用了一个简单的Prime筛子。
John d'Errico(2021年)。nthprime.(//www.tianjin-qmedu.com/matlabcentral/fileexchange/27073-nthprime),matlab中央文件交换。检索到。
好的