Skip to content

Instantly share code, notes, and snippets.

@alco
Last active December 15, 2015 19:59
Show Gist options
  • Select an option

  • Save alco/5315379 to your computer and use it in GitHub Desktop.

Select an option

Save alco/5315379 to your computer and use it in GitHub Desktop.
package main
import (
m "math"
)
const LIMIT = 100
func main() {
// They don't recomend working with raw arrays, so use a slice
prime_bools := make([]bool, LIMIT + 1)
sqrt := int(m.Sqrt(LIMIT))
// Stay true to the algorithm description
prime_bools[2], prime_bools[3], prime_bools[5] = true, true, true
for i := 1; i <= sqrt; i++ {
for j := 1; j <= sqrt; j++ {
x := uint(i * i)
y := uint(j * j)
var n uint
n = 4*x + y
if (n <= LIMIT) && (n % 12 == 1 || n % 12 == 5) { prime_bools[n] = !prime_bools[n] }
n = 3*x + y
if (n <= LIMIT) && (n % 12 == 7) { prime_bools[n] = !prime_bools[n] }
n = 3*x - y
if (i > j) && (n <= LIMIT) && (n % 12 == 11) { prime_bools[n] = !prime_bools[n] }
}
}
for i := 5; i <= LIMIT; i++ {
q := i * i
if prime_bools[i] {
for k := 1; k*q <= LIMIT; k++ {
prime_bools[k*q] = false
}
}
}
for i, flag := range prime_bools {
if flag { println(i) }
}
}
@alco

alco commented Apr 5, 2013

Copy link
Copy Markdown
Author

Можно ли как-то "красивым способом" превратить два умножения в одно на строках 39 и 40?

По ходу так. Только менее очевидно стало. Я б оставил, как есть.

    for i := 5; i <= LIMIT; i++ {
        q := i * i

        if prime_bools[i] {
            for q <= LIMIT {
                prime_bools[q] = false
                q += q  // это и есть наше умножение
            }
        }
    }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment