package main
import (
"fmt"
)
type PrimeGenerator struct {
Next func() uint32
}
func NewPrimeGenerator() *PrimeGenerator {
primeGenerator := PrimeGenerator{}
multiples := map[uint32]uint32{}
var num uint32
var d uint32
primeGenerator.Next = func() uint32 {
if num == 0 {
num = 1
return 2
}
if d == 0 {
d = 4
return 3
}
for ;; {
num += d
d = 6 - d
var k uint32 = 2
factor, hasFactor := multiples[num]
if hasFactor {
delete(multiples, num)
if (num + factor) % 3 == 0 {
k = 1
}
} else {
factor = num
}
for newNum := num + (factor << k); ; newNum += factor << k {
_, hasNewFactor := multiples[newNum]
if !hasNewFactor {
multiples[newNum] = factor
break
}
k ^= 3
}
if !hasFactor {
return num
}
}
}
return &primeGenerator
}
func main() {
n := 1000000
primeGenerator := NewPrimeGenerator()
for i := 1; i < n; i++ {
primeGenerator.Next()
}
fmt.Printf("%d番目の素数: %d", n, primeGenerator.Next())
}
cGFja2FnZSBtYWluCmltcG9ydCAoCgkiZm10IgopCgp0eXBlIFByaW1lR2VuZXJhdG9yIHN0cnVjdCB7CglOZXh0IGZ1bmMoKSB1aW50MzIKfQoKZnVuYyBOZXdQcmltZUdlbmVyYXRvcigpICpQcmltZUdlbmVyYXRvciB7CglwcmltZUdlbmVyYXRvciA6PSBQcmltZUdlbmVyYXRvcnt9CgkKCW11bHRpcGxlcyA6PSBtYXBbdWludDMyXXVpbnQzMnt9Cgl2YXIgbnVtIHVpbnQzMgoJdmFyIGQgdWludDMyCglwcmltZUdlbmVyYXRvci5OZXh0ID0gZnVuYygpIHVpbnQzMiB7CgkJaWYgbnVtID09IDAgewoJCQludW0gPSAxCgkJCXJldHVybiAyCgkJfQoJCWlmIGQgPT0gMCB7CgkJCWQgPSA0CgkJCXJldHVybiAzCgkJfQoJCQoJCWZvciA7OyB7CgkJICAgIG51bSArPSBkCgkJICAgIGQgPSA2IC0gZAoJCSAgICB2YXIgayB1aW50MzIgPSAyCgkJICAgIAoJCQlmYWN0b3IsIGhhc0ZhY3RvciA6PSBtdWx0aXBsZXNbbnVtXQoJCQlpZiBoYXNGYWN0b3IgewoJCQkJZGVsZXRlKG11bHRpcGxlcywgbnVtKQoJCQkJaWYgKG51bSArIGZhY3RvcikgJSAzID09IDAgewoJCQkJCWsgPSAxCgkJCQl9CgkJCX0gZWxzZSB7CgkJCQlmYWN0b3IgPSBudW0KCQkJfQoJCQoJCQlmb3IgbmV3TnVtIDo9IG51bSArIChmYWN0b3IgPDwgayk7IDsgbmV3TnVtICs9IGZhY3RvciA8PCBrIHsKCQkJCV8sIGhhc05ld0ZhY3RvciA6PSBtdWx0aXBsZXNbbmV3TnVtXQoJCQkJaWYgIWhhc05ld0ZhY3RvciB7CgkJCQkJbXVsdGlwbGVzW25ld051bV0gPSBmYWN0b3IKCQkJCQlicmVhawoJCQkJfQoJCQkJayBePSAzCgkJCX0KCQkJCgkJCWlmICFoYXNGYWN0b3IgewoJCQkJcmV0dXJuIG51bQoJCQl9CgkJfQoJfQoJCglyZXR1cm4gJnByaW1lR2VuZXJhdG9yCn0KCmZ1bmMgbWFpbigpIHsKCW4gOj0gMTAwMDAwMAoJcHJpbWVHZW5lcmF0b3IgOj0gTmV3UHJpbWVHZW5lcmF0b3IoKQoJZm9yIGkgOj0gMTsgaSA8IG47IGkrKyB7CgkJcHJpbWVHZW5lcmF0b3IuTmV4dCgpCgl9CglmbXQuUHJpbnRmKCIlZOeVquebruOBrue0oOaVsDogJWQiLCBuLCBwcmltZUdlbmVyYXRvci5OZXh0KCkpCn0=