Longfellow ZK 0290cb32
Loading...
Searching...
No Matches
blas.h
1// Copyright 2025 Google LLC.
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#ifndef PRIVACY_PROOFS_ZK_LIB_ALGEBRA_BLAS_H_
16#define PRIVACY_PROOFS_ZK_LIB_ALGEBRA_BLAS_H_
17
18// basic linear algebra subroutines
19#include <stddef.h>
20
21namespace proofs {
22template <class Field>
23class Blas {
24 public:
25 using Elt = typename Field::Elt;
26
27 // SUM_{i} x[i * incx].y[i * incy]
28 static Elt dot(size_t n, const Elt x[/*n:incx*/], size_t incx,
29 const Elt y[/*n:incy*/], size_t incy, const Field& F) {
30 Elt r = F.zero();
31 for (size_t i = 0; i < n; i++) {
32 F.add(r, F.mulf(x[i * incx], y[i * incy]));
33 }
34 return r;
35 }
36
37 // SUM_{i} x[i * incx], or the dot product x^T * 1
38 static Elt dot1(size_t n, const Elt x[/*n:incx*/], size_t incx,
39 const Field& F) {
40 Elt r = F.zero();
41 for (size_t i = 0; i < n; ++i) {
42 F.add(r, x[i * incx]);
43 }
44 return r;
45 }
46
47 // y = a*y
48 static void scale(size_t n, Elt y[/*k:incy*/], size_t incy, const Elt a,
49 const Field& F) {
50 for (size_t i = 0; i < n; i++) {
51 F.mul(y[i * incy], a);
52 }
53 }
54
55 // y = a*x + y.
56 static void axpy(size_t n, Elt y[/*k:incy*/], size_t incy, const Elt a,
57 const Elt x[/*k:incx*/], size_t incx, const Field& F) {
58 for (size_t i = 0; i < n; i++) {
59 F.add(y[i * incy], F.mulf(x[i * incx], a));
60 }
61 }
62
63 // nonstandard axpy() where A[] is itself an array
64 static void vaxpy(size_t n, Elt y[/*k:incy*/], size_t incy,
65 const Elt a[/*k:inca*/], size_t inca,
66 const Elt x[/*k:incx*/], size_t incx, const Field& F) {
67 for (size_t i = 0; i < n; i++) {
68 F.add(y[i * incy], F.mulf(x[i * incx], a[i * inca]));
69 }
70 }
71
72 // y[i] -= a[i] * x[i]
73 static void vymax(size_t n, Elt y[/*k:incy*/], size_t incy,
74 const Elt a[/*k:inca*/], size_t inca,
75 const Elt x[/*k:incx*/], size_t incx, const Field& F) {
76 for (size_t i = 0; i < n; i++) {
77 F.sub(y[i * incy], F.mulf(x[i * incx], a[i * inca]));
78 }
79 }
80
81 static bool equal(size_t n, const Elt x[/*n:incx*/], size_t incx,
82 const Elt y[/*n:incy*/], size_t incy, const Field& F) {
83 for (size_t i = 0; i < n; i++) {
84 if (x[i * incx] != y[i * incy]) return false;
85 }
86 return true;
87 }
88
89 static bool equal0(size_t n, const Elt x[/*n:incx*/], size_t incx,
90 const Field& F) {
91 for (size_t i = 0; i < n; i++) {
92 if (x[i * incx] != F.zero()) return false;
93 }
94 return true;
95 }
96
97 static void copy(size_t n, Elt dst[/*n:incx*/], size_t incd,
98 const Elt src[/*n:incy*/], size_t incs) {
99 for (size_t i = 0; i < n; i++) {
100 dst[i * incd] = src[i * incs];
101 }
102 }
103
104 // DST[i] = SRC[IDX[i]]. DST and SRC must not overlap.
105 static void gather(size_t n, Elt dst[/*n*/], const Elt src[],
106 const size_t idx[/*n*/]) {
107 for (size_t i = 0; i < n; i++) {
108 dst[i] = src[idx[i]];
109 }
110 }
111
112 static void clear(size_t n, Elt dst[/*n:incx*/], size_t incd,
113 const Field& F) {
114 for (size_t i = 0; i < n; i++) {
115 dst[i * incd] = F.zero();
116 }
117 }
118};
119} // namespace proofs
120
121#endif // PRIVACY_PROOFS_ZK_LIB_ALGEBRA_BLAS_H_
Definition blas.h:23
Definition gf2_128.h:63