github.com/consensys/gnark-crypto@v0.14.0/ecc/bls12-378/internal/fptower/e6_test.go (about) 1 // Copyright 2020 Consensys Software Inc. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 // Code generated by consensys/gnark-crypto DO NOT EDIT 16 17 package fptower 18 19 import ( 20 "testing" 21 22 "github.com/leanovate/gopter" 23 "github.com/leanovate/gopter/prop" 24 ) 25 26 // ------------------------------------------------------------ 27 // tests 28 29 func TestE6ReceiverIsOperand(t *testing.T) { 30 31 t.Parallel() 32 parameters := gopter.DefaultTestParameters() 33 if testing.Short() { 34 parameters.MinSuccessfulTests = nbFuzzShort 35 } else { 36 parameters.MinSuccessfulTests = nbFuzz 37 } 38 39 properties := gopter.NewProperties(parameters) 40 41 genA := GenE6() 42 genB := GenE6() 43 genE2 := GenE2() 44 45 properties.Property("[BLS12-378] Having the receiver as operand (addition) should output the same result", prop.ForAll( 46 func(a, b *E6) bool { 47 var c, d E6 48 d.Set(a) 49 c.Add(a, b) 50 a.Add(a, b) 51 b.Add(&d, b) 52 return a.Equal(b) && a.Equal(&c) && b.Equal(&c) 53 }, 54 genA, 55 genB, 56 )) 57 58 properties.Property("[BLS12-378] Having the receiver as operand (sub) should output the same result", prop.ForAll( 59 func(a, b *E6) bool { 60 var c, d E6 61 d.Set(a) 62 c.Sub(a, b) 63 a.Sub(a, b) 64 b.Sub(&d, b) 65 return a.Equal(b) && a.Equal(&c) && b.Equal(&c) 66 }, 67 genA, 68 genB, 69 )) 70 71 properties.Property("[BLS12-378] Having the receiver as operand (mul) should output the same result", prop.ForAll( 72 func(a, b *E6) bool { 73 var c, d E6 74 d.Set(a) 75 c.Mul(a, b) 76 a.Mul(a, b) 77 b.Mul(&d, b) 78 return a.Equal(b) && a.Equal(&c) && b.Equal(&c) 79 }, 80 genA, 81 genB, 82 )) 83 84 properties.Property("[BLS12-378] Having the receiver as operand (square) should output the same result", prop.ForAll( 85 func(a *E6) bool { 86 var b E6 87 b.Square(a) 88 a.Square(a) 89 return a.Equal(&b) 90 }, 91 genA, 92 )) 93 94 properties.Property("[BLS12-378] Having the receiver as operand (neg) should output the same result", prop.ForAll( 95 func(a *E6) bool { 96 var b E6 97 b.Neg(a) 98 a.Neg(a) 99 return a.Equal(&b) 100 }, 101 genA, 102 )) 103 104 properties.Property("[BLS12-378] Having the receiver as operand (double) should output the same result", prop.ForAll( 105 func(a *E6) bool { 106 var b E6 107 b.Double(a) 108 a.Double(a) 109 return a.Equal(&b) 110 }, 111 genA, 112 )) 113 114 properties.Property("[BLS12-378] Having the receiver as operand (mul by non residue) should output the same result", prop.ForAll( 115 func(a *E6) bool { 116 var b E6 117 b.MulByNonResidue(a) 118 a.MulByNonResidue(a) 119 return a.Equal(&b) 120 }, 121 genA, 122 )) 123 124 properties.Property("[BLS12-378] Having the receiver as operand (Inverse) should output the same result", prop.ForAll( 125 func(a *E6) bool { 126 var b E6 127 b.Inverse(a) 128 a.Inverse(a) 129 return a.Equal(&b) 130 }, 131 genA, 132 )) 133 134 properties.Property("[BLS12-378] Having the receiver as operand (mul by E2) should output the same result", prop.ForAll( 135 func(a *E6, b *E2) bool { 136 var c E6 137 c.MulByE2(a, b) 138 a.MulByE2(a, b) 139 return a.Equal(&c) 140 }, 141 genA, 142 genE2, 143 )) 144 145 properties.TestingRun(t, gopter.ConsoleReporter(false)) 146 } 147 148 func TestE6Ops(t *testing.T) { 149 150 t.Parallel() 151 parameters := gopter.DefaultTestParameters() 152 if testing.Short() { 153 parameters.MinSuccessfulTests = nbFuzzShort 154 } else { 155 parameters.MinSuccessfulTests = nbFuzz 156 } 157 158 properties := gopter.NewProperties(parameters) 159 160 genA := GenE6() 161 genB := GenE6() 162 genE2 := GenE2() 163 164 properties.Property("[BLS12-378] sub & add should leave an element invariant", prop.ForAll( 165 func(a, b *E6) bool { 166 var c E6 167 c.Set(a) 168 c.Add(&c, b).Sub(&c, b) 169 return c.Equal(a) 170 }, 171 genA, 172 genB, 173 )) 174 175 properties.Property("[BLS12-378] mul & inverse should leave an element invariant", prop.ForAll( 176 func(a, b *E6) bool { 177 var c, d E6 178 d.Inverse(b) 179 c.Set(a) 180 c.Mul(&c, b).Mul(&c, &d) 181 return c.Equal(a) 182 }, 183 genA, 184 genB, 185 )) 186 187 properties.Property("[BLS12-378] inverse twice should leave an element invariant", prop.ForAll( 188 func(a *E6) bool { 189 var b E6 190 b.Inverse(a).Inverse(&b) 191 return a.Equal(&b) 192 }, 193 genA, 194 )) 195 196 properties.Property("[BLS12-378] BatchInvertE6 should output the same result as Inverse", prop.ForAll( 197 func(a, b, c *E6) bool { 198 199 batch := BatchInvertE6([]E6{*a, *b, *c}) 200 a.Inverse(a) 201 b.Inverse(b) 202 c.Inverse(c) 203 return a.Equal(&batch[0]) && b.Equal(&batch[1]) && c.Equal(&batch[2]) 204 }, 205 genA, 206 genA, 207 genA, 208 )) 209 210 properties.Property("[BLS12-378] neg twice should leave an element invariant", prop.ForAll( 211 func(a *E6) bool { 212 var b E6 213 b.Neg(a).Neg(&b) 214 return a.Equal(&b) 215 }, 216 genA, 217 )) 218 219 properties.Property("[BLS12-378] square and mul should output the same result", prop.ForAll( 220 func(a *E6) bool { 221 var b, c E6 222 b.Mul(a, a) 223 c.Square(a) 224 return b.Equal(&c) 225 }, 226 genA, 227 )) 228 229 properties.Property("[BLS12-378] Double and add twice should output the same result", prop.ForAll( 230 func(a *E6) bool { 231 var b E6 232 b.Add(a, a) 233 a.Double(a) 234 return a.Equal(&b) 235 }, 236 genA, 237 )) 238 239 properties.Property("[BLS12-378] Mul by non residue should be the same as multiplying by (0,1,0)", prop.ForAll( 240 func(a *E6) bool { 241 var b, c E6 242 b.B1.A0.SetOne() 243 c.Mul(a, &b) 244 a.MulByNonResidue(a) 245 return a.Equal(&c) 246 }, 247 genA, 248 )) 249 250 properties.Property("[BLS12-378] MulByE2 MulByE2 inverse should leave an element invariant", prop.ForAll( 251 func(a *E6, b *E2) bool { 252 var c E6 253 var d E2 254 d.Inverse(b) 255 c.MulByE2(a, b).MulByE2(&c, &d) 256 return c.Equal(a) 257 }, 258 genA, 259 genE2, 260 )) 261 262 properties.Property("[BLS12-378] Mul and MulBy01 should output the same result", prop.ForAll( 263 func(a *E6, c0, c1 *E2) bool { 264 var b E6 265 b.B0.Set(c0) 266 b.B1.Set(c1) 267 b.Mul(&b, a) 268 a.MulBy01(c0, c1) 269 return b.Equal(a) 270 }, 271 genA, 272 genE2, 273 genE2, 274 )) 275 276 properties.Property("[BLS12-378] Mul and MulBy1 should output the same result", prop.ForAll( 277 func(a *E6, c1 *E2) bool { 278 var b E6 279 b.B1.Set(c1) 280 b.Mul(&b, a) 281 a.MulBy1(c1) 282 return b.Equal(a) 283 }, 284 genA, 285 genE2, 286 )) 287 288 properties.TestingRun(t, gopter.ConsoleReporter(false)) 289 290 } 291 292 // ------------------------------------------------------------ 293 // benches 294 295 func BenchmarkE6Add(b *testing.B) { 296 var a, c E6 297 _, _ = a.SetRandom() 298 _, _ = c.SetRandom() 299 b.ResetTimer() 300 for i := 0; i < b.N; i++ { 301 a.Add(&a, &c) 302 } 303 } 304 305 func BenchmarkE6Sub(b *testing.B) { 306 var a, c E6 307 _, _ = a.SetRandom() 308 _, _ = c.SetRandom() 309 b.ResetTimer() 310 for i := 0; i < b.N; i++ { 311 a.Sub(&a, &c) 312 } 313 } 314 315 func BenchmarkE6Mul(b *testing.B) { 316 var a, c E6 317 _, _ = a.SetRandom() 318 _, _ = c.SetRandom() 319 b.ResetTimer() 320 for i := 0; i < b.N; i++ { 321 a.Mul(&a, &c) 322 } 323 } 324 325 func BenchmarkE6Square(b *testing.B) { 326 var a E6 327 _, _ = a.SetRandom() 328 b.ResetTimer() 329 for i := 0; i < b.N; i++ { 330 a.Square(&a) 331 } 332 } 333 334 func BenchmarkE6Inverse(b *testing.B) { 335 var a E6 336 _, _ = a.SetRandom() 337 b.ResetTimer() 338 for i := 0; i < b.N; i++ { 339 a.Inverse(&a) 340 } 341 } 342 343 func TestE6Div(t *testing.T) { 344 345 parameters := gopter.DefaultTestParameters() 346 properties := gopter.NewProperties(parameters) 347 348 genA := GenE6() 349 genB := GenE6() 350 351 properties.Property("[BLS12-378] dividing then multiplying by the same element does nothing", prop.ForAll( 352 func(a, b *E6) bool { 353 var c E6 354 c.Div(a, b) 355 c.Mul(&c, b) 356 return c.Equal(a) 357 }, 358 genA, 359 genB, 360 )) 361 362 properties.TestingRun(t, gopter.ConsoleReporter(false)) 363 }