| // Copyright 2016 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| package big | |
| import ( | |
| "fmt" | |
| "testing" | |
| ) | |
| var primes = []string{ | |
| "2", | |
| "3", | |
| "5", | |
| "7", | |
| "11", | |
| "13756265695458089029", | |
| "13496181268022124907", | |
| "10953742525620032441", | |
| "17908251027575790097", | |
| // https://golang.org/issue/638 | |
| "18699199384836356663", | |
| "98920366548084643601728869055592650835572950932266967461790948584315647051443", | |
| "94560208308847015747498523884063394671606671904944666360068158221458669711639", | |
| // http://primes.utm.edu/lists/small/small3.html | |
| "449417999055441493994709297093108513015373787049558499205492347871729927573118262811508386655998299074566974373711472560655026288668094291699357843464363003144674940345912431129144354948751003607115263071543163", | |
| "230975859993204150666423538988557839555560243929065415434980904258310530753006723857139742334640122533598517597674807096648905501653461687601339782814316124971547968912893214002992086353183070342498989426570593", | |
| "5521712099665906221540423207019333379125265462121169655563495403888449493493629943498064604536961775110765377745550377067893607246020694972959780839151452457728855382113555867743022746090187341871655890805971735385789993", | |
| "203956878356401977405765866929034577280193993314348263094772646453283062722701277632936616063144088173312372882677123879538709400158306567338328279154499698366071906766440037074217117805690872792848149112022286332144876183376326512083574821647933992961249917319836219304274280243803104015000563790123", | |
| // ECC primes: http://tools.ietf.org/html/draft-ladd-safecurves-02 | |
| "3618502788666131106986593281521497120414687020801267626233049500247285301239", // Curve1174: 2^251-9 | |
| "57896044618658097711785492504343953926634992332820282019728792003956564819949", // Curve25519: 2^255-19 | |
| "9850501549098619803069760025035903451269934817616361666987073351061430442874302652853566563721228910201656997576599", // E-382: 2^382-105 | |
| "42307582002575910332922579714097346549017899709713998034217522897561970639123926132812109468141778230245837569601494931472367", // Curve41417: 2^414-17 | |
| "6864797660130609714981900799081393217269435300143305409394463459185543183397656052122559640661454554977296311391480858037121987999716643812574028291115057151", // E-521: 2^521-1 | |
| } | |
| var composites = []string{ | |
| "0", | |
| "1", | |
| "21284175091214687912771199898307297748211672914763848041968395774954376176754", | |
| "6084766654921918907427900243509372380954290099172559290432744450051395395951", | |
| "84594350493221918389213352992032324280367711247940675652888030554255915464401", | |
| "82793403787388584738507275144194252681", | |
| } | |
| func TestProbablyPrime(t *testing.T) { | |
| nreps := 20 | |
| if testing.Short() { | |
| nreps = 1 | |
| } | |
| for i, s := range primes { | |
| p, _ := new(Int).SetString(s, 10) | |
| if !p.ProbablyPrime(nreps) { | |
| t.Errorf("#%d prime found to be non-prime (%s)", i, s) | |
| } | |
| } | |
| for i, s := range composites { | |
| c, _ := new(Int).SetString(s, 10) | |
| if c.ProbablyPrime(nreps) { | |
| t.Errorf("#%d composite found to be prime (%s)", i, s) | |
| } | |
| if testing.Short() { | |
| break | |
| } | |
| } | |
| // check that ProbablyPrime panics if n <= 0 | |
| c := NewInt(11) // a prime | |
| for _, n := range []int{-1, 0, 1} { | |
| func() { | |
| defer func() { | |
| if n <= 0 && recover() == nil { | |
| t.Fatalf("expected panic from ProbablyPrime(%d)", n) | |
| } | |
| }() | |
| if !c.ProbablyPrime(n) { | |
| t.Fatalf("%v should be a prime", c) | |
| } | |
| }() | |
| } | |
| } | |
| func BenchmarkProbablyPrime(b *testing.B) { | |
| p, _ := new(Int).SetString("203956878356401977405765866929034577280193993314348263094772646453283062722701277632936616063144088173312372882677123879538709400158306567338328279154499698366071906766440037074217117805690872792848149112022286332144876183376326512083574821647933992961249917319836219304274280243803104015000563790123", 10) | |
| for _, rep := range []int{1, 5, 10, 20} { | |
| b.Run(fmt.Sprintf("Rep=%d", rep), func(b *testing.B) { | |
| for i := 0; i < b.N; i++ { | |
| p.ProbablyPrime(rep) | |
| } | |
| }) | |
| } | |
| } |