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