int prime(unsigned long long n){
unsigned val=1, divisor=7;
if(n==2 || n==3) return 1; //n=2, n=3 (special cases).
if(n<2 || !(n%2 && n%3)) return 0; //if(n<2 || n%2==0 || n%3==0) return 0;
for(; divisor<=n/divisor; val++, divisor=6*val+1) //all primes take the form 6*k(+ or -)1, k[1, n).
if(!(n%divisor && n%(divisor-2))) return 0; //if(n%divisor==0 || n%(divisor-2)==0) return 0;
return 1;
}
上記のコードは、友人が素数を取得するために作成したものです。ある種のふるい分けを使用しているようですが、正確にどのように機能するかはわかりません。以下のコードは、それほど素晴らしいバージョンではありません。私は自分のループに使用sqrt
しますが、彼が何か他のことをしているのを見た (おそらく関連するふるい) ので、気にしませんでした。
int prime( unsigned long long n ){
unsigned i=5;
if(n < 4 && n > 0)
return 1;
if(n<=0 || !(n%2 || n%3))
return 0;
for(;i<n; i+=2)
if(!(n%i)) return 0;
return 1;
}
私の質問は、彼は正確に何をしているのですか?