fork(1) download
  1. package main
  2. import (
  3. "fmt"
  4. )
  5.  
  6. type PrimeGenerator struct {
  7. Next func() uint32
  8. }
  9.  
  10. func NewPrimeGenerator() *PrimeGenerator {
  11. primeGenerator := PrimeGenerator{}
  12.  
  13. multiples := map[uint32]uint32{}
  14. var num uint32
  15. primeGenerator.Next = func() uint32 {
  16. if num == 0 {
  17. num = 1
  18. return 2
  19. }
  20.  
  21. for ;; {
  22. num += 2
  23.  
  24. factor, hasFactor := multiples[num]
  25. if hasFactor {
  26. delete(multiples, num)
  27. } else {
  28. factor = num << 1
  29. }
  30.  
  31. for newNum := num + factor; ; newNum += factor {
  32. _, hasNewFactor := multiples[newNum]
  33. if !hasNewFactor {
  34. multiples[newNum] = factor
  35. break
  36. }
  37. }
  38.  
  39. if !hasFactor {
  40. return num
  41. }
  42. }
  43. }
  44.  
  45. return &primeGenerator
  46. }
  47.  
  48. func main() {
  49. n := 1000000
  50. primeGenerator := NewPrimeGenerator()
  51. for i := 1; i < n; i++ {
  52. primeGenerator.Next()
  53. }
  54. fmt.Printf("%d番目の素数: %d", n, primeGenerator.Next())
  55. }
Success #stdin #stdout 2.1s 49712KB
stdin
Standard input is empty
stdout
1000000番目の素数: 15485863