Guest User

Untitled

a guest
Oct 17th, 2018
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.08 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "time"
  6. )
  7.  
  8. type number struct {
  9. n int
  10. d int
  11. s []int
  12. }
  13.  
  14. func newNumber(x int) *number {
  15. if x <= 1 {
  16. return &number{n: 0, d: 0}
  17. }
  18. return &number{n: x, d: x}
  19. }
  20.  
  21. func (n *number) div(p int) {
  22. if n.d%p == 0 {
  23. for n.d%p == 0 {
  24. n.d /= p
  25. }
  26. n.s = append(n.s, p)
  27. }
  28. }
  29.  
  30. func (x number) phi() (answer int64) {
  31. if x.n <= 1 {
  32. return 0
  33. }
  34. if x.n == x.d {
  35. return int64(x.n) - 1
  36. }
  37. ratio := [2]int64{int64(x.n), 1}
  38. for i := range x.s {
  39. p := int64(x.s[i])
  40. ratio[0] *= p - 1
  41. ratio[1] *= p
  42. }
  43. return ratio[0] / ratio[1]
  44. }
  45.  
  46. type numbers []*number
  47.  
  48. func newNumbers(max int) (answer numbers) {
  49. answer = make(numbers, max+1)
  50. for i := range answer {
  51. answer[i] = newNumber(i)
  52. }
  53. for p := 2; 2*p <= max; p++ {
  54. if answer[p].n == answer[p].d {
  55. for i := 2; p*i <= max; i++ {
  56. answer[p*i].div(p)
  57. }
  58. }
  59. }
  60. return
  61. }
  62.  
  63. func problem72() (answer int64) {
  64. xs := newNumbers(1000000)
  65. for i := range xs {
  66. answer += int64(xs[i].phi())
  67. }
  68. return
  69. }
  70.  
  71. func main() {
  72. start := time.Now()
  73. fmt.Println(problem72())
  74. end := time.Now()
  75. fmt.Println(end.Sub(start).Seconds())
  76. }
Add Comment
Please, Sign In to add comment