package main
import (
"fmt"
)
type PrimeGenerator struct {
Next func() uint32
}
func NewPrimeGenerator() *PrimeGenerator {
primeGenerator := PrimeGenerator{}
multiples := map[uint32]uint32{}
wheelCycle := []uint32{10, 2, 4, 2, 4, 6, 2, 6, 4, 2, 4, 6, 6, 2, 6, 4, 2, 6, 4, 6, 8, 4, 2, 4, 2, 4, 8, 6, 4, 6, 2, 4, 6, 2, 6, 6, 4, 2, 4, 6, 2, 6, 4, 2, 4, 2, 10, 2}
var num uint32
var i uint32 = 0
primeGenerator.Next = func() uint32 {
if num == 0 {
num = 2
return 2
}
if num == 2 {
num = 3
return 3
}
if num == 3 {
num = 5
return 5
}
if num == 5 {
num = 1
return 7
}
for ; ; {
num += wheelCycle[i]
i = (i + 1) % 48
factor, hasFactor := multiples[num]
var k uint32
if hasFactor {
delete(multiples, num)
switch (num / factor) % 210{
case 1: k = 0
case 11: k = 1
case 13: k = 2
case 17: k = 3
case 19: k = 4
case 23: k = 5
case 29: k = 6
case 31: k = 7
case 37: k = 8
case 41: k = 9
case 43: k = 10
case 47: k = 11
case 53: k = 12
case 59: k = 13
case 61: k = 14
case 67: k = 15
case 71: k = 16
case 73: k = 17
case 79: k = 18
case 83: k = 19
case 89: k = 20
case 97: k = 21
case 101: k = 22
case 103: k = 23
case 107: k = 24
case 109: k = 25
case 113: k = 26
case 121: k = 27
case 127: k = 28
case 131: k = 29
case 137: k = 30
case 139: k = 31
case 143: k = 32
case 149: k = 33
case 151: k = 34
case 157: k = 35
case 163: k = 36
case 167: k = 37
case 169: k = 38
case 173: k = 39
case 179: k = 40
case 181: k = 41
case 187: k = 42
case 191: k = 43
case 193: k = 44
case 197: k = 45
case 199: k = 46
case 209: k = 47
}
} else {
factor = num
}
for newNum := num + factor * wheelCycle[k]; ; newNum += factor * wheelCycle[k] {
_, hasNewFactor := multiples[newNum]
if !hasNewFactor {
multiples[newNum] = factor
break
}
k = (k + 1) % 48
}
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())
}
cGFja2FnZSBtYWluCmltcG9ydCAoCgkiZm10IgopCgp0eXBlIFByaW1lR2VuZXJhdG9yIHN0cnVjdCB7CglOZXh0IGZ1bmMoKSB1aW50MzIKfQoKZnVuYyBOZXdQcmltZUdlbmVyYXRvcigpICpQcmltZUdlbmVyYXRvciB7CglwcmltZUdlbmVyYXRvciA6PSBQcmltZUdlbmVyYXRvcnt9CgkKCW11bHRpcGxlcyA6PSBtYXBbdWludDMyXXVpbnQzMnt9Cgl3aGVlbEN5Y2xlIDo9IFtddWludDMyezEwLCAyLCA0LCAyLCA0LCA2LCAyLCA2LCA0LCAyLCA0LCA2LCA2LCAyLCA2LCA0LCAyLCA2LCA0LCA2LCA4LCA0LCAyLCA0LCAyLCA0LCA4LCA2LCA0LCA2LCAyLCA0LCA2LCAyLCA2LCA2LCA0LCAyLCA0LCA2LCAyLCA2LCA0LCAyLCA0LCAyLCAxMCwgMn0KCXZhciBudW0gdWludDMyCgl2YXIgaSB1aW50MzIgPSAwCglwcmltZUdlbmVyYXRvci5OZXh0ID0gZnVuYygpIHVpbnQzMiB7CgkJaWYgbnVtID09IDAgewoJCQludW0gPSAyCgkJCXJldHVybiAyCgkJfQoJCWlmIG51bSA9PSAyIHsKCQkJbnVtID0gMwoJCQlyZXR1cm4gMwoJCX0KCQlpZiBudW0gPT0gMyB7CgkJCW51bSA9IDUKCQkJcmV0dXJuIDUKCQl9CgkJaWYgbnVtID09IDUgewoJCQludW0gPSAxCgkJCXJldHVybiA3CgkJfQoJCQoJCWZvciA7IDsgewoJCQludW0gKz0gd2hlZWxDeWNsZVtpXQoJCQlpID0gKGkgKyAxKSAlIDQ4CgkJCQoJCQlmYWN0b3IsIGhhc0ZhY3RvciA6PSBtdWx0aXBsZXNbbnVtXQoJCQl2YXIgayB1aW50MzIKCQkJaWYgaGFzRmFjdG9yIHsKCQkJCWRlbGV0ZShtdWx0aXBsZXMsIG51bSkKCQkJCQoJCQkJc3dpdGNoIChudW0gLyBmYWN0b3IpICUgMjEwewoJCQkJY2FzZSAxOiBrID0gMAoJCQkJY2FzZSAxMTogayA9IDEKCQkJCWNhc2UgMTM6IGsgPSAyCgkJCQljYXNlIDE3OiBrID0gMwoJCQkJY2FzZSAxOTogayA9IDQKCQkJCWNhc2UgMjM6IGsgPSA1CgkJCQljYXNlIDI5OiBrID0gNgoJCQkJY2FzZSAzMTogayA9IDcKCQkJCWNhc2UgMzc6IGsgPSA4CgkJCQljYXNlIDQxOiBrID0gOQoJCQkJY2FzZSA0MzogayA9IDEwCgkJCQljYXNlIDQ3OiBrID0gMTEKCQkJCWNhc2UgNTM6IGsgPSAxMgoJCQkJY2FzZSA1OTogayA9IDEzCgkJCQljYXNlIDYxOiBrID0gMTQKCQkJCWNhc2UgNjc6IGsgPSAxNQoJCQkJY2FzZSA3MTogayA9IDE2CgkJCQljYXNlIDczOiBrID0gMTcKCQkJCWNhc2UgNzk6IGsgPSAxOAoJCQkJY2FzZSA4MzogayA9IDE5CgkJCQljYXNlIDg5OiBrID0gMjAKCQkJCWNhc2UgOTc6IGsgPSAyMQoJCQkJY2FzZSAxMDE6IGsgPSAyMgoJCQkJY2FzZSAxMDM6IGsgPSAyMwoJCQkJY2FzZSAxMDc6IGsgPSAyNAoJCQkJY2FzZSAxMDk6IGsgPSAyNQoJCQkJY2FzZSAxMTM6IGsgPSAyNgoJCQkJY2FzZSAxMjE6IGsgPSAyNwoJCQkJY2FzZSAxMjc6IGsgPSAyOAoJCQkJY2FzZSAxMzE6IGsgPSAyOQoJCQkJY2FzZSAxMzc6IGsgPSAzMAoJCQkJY2FzZSAxMzk6IGsgPSAzMQoJCQkJY2FzZSAxNDM6IGsgPSAzMgoJCQkJY2FzZSAxNDk6IGsgPSAzMwoJCQkJY2FzZSAxNTE6IGsgPSAzNAoJCQkJY2FzZSAxNTc6IGsgPSAzNQoJCQkJY2FzZSAxNjM6IGsgPSAzNgoJCQkJY2FzZSAxNjc6IGsgPSAzNwoJCQkJY2FzZSAxNjk6IGsgPSAzOAoJCQkJY2FzZSAxNzM6IGsgPSAzOQoJCQkJY2FzZSAxNzk6IGsgPSA0MAoJCQkJY2FzZSAxODE6IGsgPSA0MQoJCQkJY2FzZSAxODc6IGsgPSA0MgoJCQkJY2FzZSAxOTE6IGsgPSA0MwoJCQkJY2FzZSAxOTM6IGsgPSA0NAoJCQkJY2FzZSAxOTc6IGsgPSA0NQoJCQkJY2FzZSAxOTk6IGsgPSA0NgoJCQkJY2FzZSAyMDk6IGsgPSA0NwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJZmFjdG9yID0gbnVtCgkJCX0KCQkJCgkJCWZvciBuZXdOdW0gOj0gbnVtICsgZmFjdG9yICogd2hlZWxDeWNsZVtrXTsgOyBuZXdOdW0gKz0gZmFjdG9yICogd2hlZWxDeWNsZVtrXSB7CgkJCQlfLCBoYXNOZXdGYWN0b3IgOj0gbXVsdGlwbGVzW25ld051bV0KCQkJCWlmICFoYXNOZXdGYWN0b3IgewoJCQkJCW11bHRpcGxlc1tuZXdOdW1dID0gZmFjdG9yCgkJCQkJYnJlYWsKCQkJCX0KCQkJCWsgPSAoayArIDEpICUgNDgKCQkJfQoJCQkKCQkJaWYgIWhhc0ZhY3RvciB7CgkJCQlyZXR1cm4gbnVtCgkJCX0KCQl9Cgl9CgkKCXJldHVybiAmcHJpbWVHZW5lcmF0b3IKfQoKZnVuYyBtYWluKCkgewoJbiA6PSAxMDAwMDAwCglwcmltZUdlbmVyYXRvciA6PSBOZXdQcmltZUdlbmVyYXRvcigpCglmb3IgaSA6PSAxOyBpIDwgbjsgaSsrIHsKCQlwcmltZUdlbmVyYXRvci5OZXh0KCkKCX0KCWZtdC5QcmludGYoIiVk55Wq55uu44Gu57Sg5pWwOiAlZCIsIG4sIHByaW1lR2VuZXJhdG9yLk5leHQoKSkKfQ==