Compare commits
3 Commits
bb8f398cfa
...
main
Author | SHA1 | Date | |
---|---|---|---|
583dd98ec6 | |||
ffc330e901 | |||
58d5c52886 |
54
main.go
54
main.go
@ -6,6 +6,7 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
"math/big"
|
"math/big"
|
||||||
mrand "math/rand"
|
mrand "math/rand"
|
||||||
|
"runtime"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -17,11 +18,12 @@ type job struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
runtime.GOMAXPROCS(101)
|
||||||
s1 := mrand.NewSource(time.Now().UnixMicro())
|
s1 := mrand.NewSource(time.Now().UnixMicro())
|
||||||
r1 := mrand.New(s1)
|
r1 := mrand.New(s1)
|
||||||
start := time.Now()
|
start := time.Now()
|
||||||
|
|
||||||
p, _ := prime(r1, 8096, 1000)
|
p, _ := prime(r1, 8096, 100)
|
||||||
|
|
||||||
finish := time.Now()
|
finish := time.Now()
|
||||||
elapsed := finish.Sub(start)
|
elapsed := finish.Sub(start)
|
||||||
@ -38,11 +40,12 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func prime(rand io.Reader, bits int, threads int) (p *big.Int, err error) {
|
func prime(rand io.Reader, bits int, threads int) (p *big.Int, err error) {
|
||||||
bytes := make([]byte, (bits+7)/8)
|
//bytes := make([]byte, (bits+7)/8)
|
||||||
|
|
||||||
p = new(big.Int)
|
//p = new(big.Int)
|
||||||
jobs := make(chan job)
|
jobs := make(chan job, 100)
|
||||||
results := make(chan job)
|
results := make(chan job, 100)
|
||||||
|
numbers := make(chan *big.Int, 100)
|
||||||
done := new(bool)
|
done := new(bool)
|
||||||
*done = false
|
*done = false
|
||||||
|
|
||||||
@ -50,21 +53,17 @@ func prime(rand io.Reader, bits int, threads int) (p *big.Int, err error) {
|
|||||||
go worker(i, jobs, results, done)
|
go worker(i, jobs, results, done)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fmt.Printf("Seeding and starting worker pool\n")
|
||||||
|
for i := 0; i < 10; i++ {
|
||||||
|
go rng(i, bits, numbers, done)
|
||||||
|
time.Sleep(1 * time.Millisecond)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Printf("Starting!\n")
|
||||||
for i := 0; ; i++ {
|
for i := 0; ; i++ {
|
||||||
_, err = io.ReadFull(rand, bytes)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
// This makes sure that the least significant bit is always 1
|
|
||||||
// meaning that the number is always odd, since even numbers
|
|
||||||
// aren't prime
|
|
||||||
bytes[len(bytes)-1] |= 1
|
|
||||||
|
|
||||||
p.SetBytes(bytes)
|
|
||||||
|
|
||||||
newjob := &job{
|
newjob := &job{
|
||||||
p: p,
|
p: <-numbers,
|
||||||
i: 10,
|
i: 20,
|
||||||
id: i,
|
id: i,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -82,11 +81,28 @@ func prime(rand io.Reader, bits int, threads int) (p *big.Int, err error) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func rng(id int, bits int, num chan<- *big.Int, done *bool) {
|
||||||
|
s1 := mrand.NewSource(time.Hour.Microseconds())
|
||||||
|
rand := mrand.New(s1)
|
||||||
|
bytes := make([]byte, (bits+7)/8)
|
||||||
|
for !*done {
|
||||||
|
p := new(big.Int)
|
||||||
|
io.ReadFull(rand, bytes)
|
||||||
|
// This makes sure that the least significant bit is always 1
|
||||||
|
// meaning that the number is always odd, since even numbers
|
||||||
|
// aren't prime
|
||||||
|
bytes[len(bytes)-1] |= 1
|
||||||
|
|
||||||
|
p.SetBytes(bytes)
|
||||||
|
num <- p
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func worker(id int, jobs <-chan job, results chan<- job, done *bool) {
|
func worker(id int, jobs <-chan job, results chan<- job, done *bool) {
|
||||||
//fmt.Printf("Worker %d starting now!\n", id)
|
//fmt.Printf("Worker %d starting now!\n", id)
|
||||||
for j := range jobs {
|
for j := range jobs {
|
||||||
j.result = j.p.ProbablyPrime(j.i)
|
j.result = j.p.ProbablyPrime(j.i)
|
||||||
//fmt.Printf("Worker\t %d checked a number\n", id)
|
fmt.Printf("Worker\t %d checked a number\n", id)
|
||||||
if *done {
|
if *done {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user