FK20 CUDA
frtest_fibonacci.cu
Go to the documentation of this file.
1 // bls12_381: Arithmetic for BLS12-381
2 // Copyright 2022-2023 Dag Arne Osvik
3 // Copyright 2022-2023 Luan Cardoso dos Santos
4 
5 #include "fr.cuh"
6 #include "frtest.cuh"
7 
8 #define ITERATIONS 100000
9 
16 __global__ void FrTestFibonacci(testval_t *) {
17 
18  printf("=== RUN %s\n", __func__);
19 
20  bool pass = true;
21  size_t count = 0;
22 
23  fr_t x, y, t, u;
24 
25  fr_one(x);
26  fr_one(y);
27 
28  for (int i=0; i<ITERATIONS; i++) {
29 
30  fr_cpy(t, x);
31  fr_add(x, y);
32 
33  fr_cpy(u, x);
34  fr_sub(u, t);
35 
36  if (fr_neq(u, y)) {
37  fr_print("x =", x);
38  fr_print("y =", y);
39  fr_print("x+y =", t);
40  fr_print("x+y-x =", u);
41  pass = false;
42  break;
43  }
44 
45  ++count;
46 
47  fr_cpy(t, y);
48  fr_add(y, x);
49 
50  fr_cpy(u, y);
51  fr_sub(u, t);
52 
53  if (fr_neq(u, x)) {
54  fr_print("x =", x);
55  fr_print("y =", y);
56  fr_print("x+y =", t);
57  fr_print("x+y-y =", u);
58  pass = false;
59  break;
60  }
61 
62  ++count;
63  }
64 
65  for (int i=0; i<ITERATIONS; i++) {
66  fr_sub(y, x);
67  fr_sub(x, y);
68  }
69 
70  if (!fr_isone(x) || !fr_isone(y)) {
71  printf("Reverse iteration failed\n");
72  fr_print("x =", x);
73  fr_print("y =", y);
74  pass = false;
75  }
76  else
77  ++count;
78 
79  printf("%ld tests passed\n", count);
80 
81  PRINTPASS(pass);
82 }
83 
84 // vim: ts=4 et sw=4 si
__device__ void fr_print(const char *s, const fr_t &x)
prints the canonical representation of x to STDOUT.
Definition: fr.cu:41
__device__ __host__ void fr_one(fr_t &z)
Sets the value of z to one.
Definition: fr.cu:26
__device__ void fr_sub(fr_t &z, const fr_t &x)
Calculates the difference of two residues modulo p and stores it into z.
Definition: fr_sub.cu:17
__device__ bool fr_neq(const fr_t &x, const fr_t &y)
Compares two fr_t residues.
Definition: fr_neq.cu:15
uint64_t fr_t[4]
Subgroup element stored as a 256-bit array (a 4-element little-endian array of uint64_t)....
Definition: fr.cuh:24
__device__ __host__ void fr_cpy(fr_t &z, const fr_t &x)
Copy from x into z.
Definition: fr_cpy.cu:14
__device__ bool fr_isone(const fr_t &x)
Checks if the residue x modulo f is congruent to one.
Definition: fr_isone.cu:13
__device__ void fr_add(fr_t &z, const fr_t &x)
Computes the sum of two residues x and z modulo r and stores it in z. Device only function.
Definition: fr_add.cu:16
#define ITERATIONS
__global__ void FrTestFibonacci(testval_t *)
Test addition and subtraction in Fr using a fibonacci sequence (chain dependency) from 1 to ITERATION...
#define PRINTPASS(pass)
Definition: test.h:25