相关疑难解决方法(0)

列出N以下所有素数的最快方法

这是我能提出的最佳算法.

def get_primes(n):
    numbers = set(range(n, 1, -1))
    primes = []
    while numbers:
        p = numbers.pop()
        primes.append(p)
        numbers.difference_update(set(range(p*2, n+1, p)))
    return primes

>>> timeit.Timer(stmt='get_primes.get_primes(1000000)', setup='import   get_primes').timeit(1)
1.1499958793645562
Run Code Online (Sandbox Code Playgroud)

可以做得更快吗?

此代码有一个缺陷:由于numbers是无序集,因此无法保证numbers.pop()从集中删除最小数字.然而,它对某些输入数字起作用(至少对我而言):

>>> sum(get_primes(2000000))
142913828922L
#That's the correct sum of all numbers below 2 million
>>> 529 in get_primes(1000)
False
>>> 529 in get_primes(530)
True
Run Code Online (Sandbox Code Playgroud)

python math optimization primes

347
推荐指数
11
解决办法
19万
查看次数

如何找到0到100之间的素数?

在Javascript中我怎么能找到0到100之间的素数?我已经考虑过了,我不知道如何找到它们.我想做x%x,但我发现了明显的问题.这是我到目前为止所做的:但不幸的是,这是有史以来最糟糕的代码.

var prime = function (){
var num;
for (num = 0; num < 101; num++){
    if (num % 2 === 0){
        break;
    }
    else if (num % 3 === 0){
        break;
    }
    else if (num % 4=== 0){
        break;
    }
    else if (num % 5 === 0){
        break;
    }
    else if (num % 6 === 0){
        break;
    }
    else if (num % 7 === 0){
        break;
    }
    else if (num % 8 === 0){
        break;
    }
    else if (num …
Run Code Online (Sandbox Code Playgroud)

javascript math primes

51
推荐指数
6
解决办法
15万
查看次数

Eratosthenes的分段筛子?

制作一个简单的筛子很容易:

for (int i=2; i<=N; i++){
    if (sieve[i]==0){
        cout << i << " is prime" << endl;
        for (int j = i; j<=N; j+=i){
            sieve[j]=1;
        }
    }
    cout << i << " has " << sieve[i] << " distinct prime factors\n";
}
Run Code Online (Sandbox Code Playgroud)

但是当N非常大并且我无法在内存中保存那种数组时呢?我已经查找了分段筛选方法,它们似乎涉及到找到素数直到sqrt(N),但我不明白它是如何工作的.如果N非常大(例如10 ^ 18)怎么办?

algorithm primes sieve-of-eratosthenes prime-factoring factors

38
推荐指数
3
解决办法
3万
查看次数

在JavaScript中运行Eratosthenes算法的Sieve对大量运行无穷无尽

我一直在尝试用JavaScript 编写Sieve of Eratosthenes算法.基本上我只是遵循以下步骤:

  1. 创建从2到(n-1)的连续整数列表
  2. 设第一个素数p等于2
  3. 从p开始,以p为增量计数并删除每个数字(p和p的倍数)
  4. 转到列表中的下一个数字并重复2,3,4
  5. 将无意删除的素数添加回列表

这就是我想出的:

function eratosthenes(n){
var array = [];
var tmpArray = []; // for containing unintentionally deleted elements like 2,3,5,7,...
var maxPrimeFactor = 0;
var upperLimit = Math.sqrt(n);
var output = [];

// Eratosthenes algorithm to find all primes under n

// Make an array from 2 to (n - 1)
//used as a base array to delete composite number from
for(var i = 2; i < n; i++){
    array.push(i); …
Run Code Online (Sandbox Code Playgroud)

javascript arrays algorithm primes sieve-of-eratosthenes

17
推荐指数
3
解决办法
2万
查看次数

寻找快速素数计数函数

我需要计算小于或等于某个 N 的素数个数,这就是素数计数函数或 PI 函数。我有这个,但运行速度太慢:

function PI(x) {
    var primes = 4;
    for (var i = 3; i <= x; i += 2) {
        if (i % 3 === 0 || i % 5 === 0 || i % 7 === 0) continue;
        var r = ~~Math.sqrt(i), p = true;
        for (var j = 2; j <= r; j++) {
            if (i % j === 0) {
                p = false;
                break;
            }
        }
        if (p)
            primes++;
    }
    return primes;
} …
Run Code Online (Sandbox Code Playgroud)

javascript

2
推荐指数
1
解决办法
1028
查看次数