Skip to content
This repository was archived by the owner on Feb 17, 2025. It is now read-only.

Commit e42f2e7

Browse files
tshchelovekIluvmagick
authored andcommitted
field operations #308
1 parent 8c2e311 commit e42f2e7

File tree

7 files changed

+160
-0
lines changed

7 files changed

+160
-0
lines changed

include/nil/blueprint/components/algebra/fields/plonk/addition.hpp

+26
Original file line numberDiff line numberDiff line change
@@ -86,9 +86,13 @@ namespace nil {
8686
std::size_t lookup_column_amount) {
8787
return 1;
8888
}
89+
constexpr static std::size_t get_empty_rows_amount() {
90+
return 1;
91+
}
8992

9093
constexpr static const std::size_t gates_amount = 1;
9194
const std::size_t rows_amount = get_rows_amount(this->witness_amount(), 0);
95+
const std::size_t empty_rows_amount = get_empty_rows_amount();
9296

9397
struct input_type {
9498
var x = var(0, 0, false);
@@ -129,6 +133,11 @@ namespace nil {
129133
std::initializer_list<typename component_type::public_input_container_type::value_type>
130134
public_inputs) :
131135
component_type(witnesses, constants, public_inputs, get_manifest()) {};
136+
137+
static typename BlueprintFieldType::value_type calculate(typename BlueprintFieldType::value_type x,
138+
typename BlueprintFieldType::value_type y) {
139+
return x + y;
140+
}
132141
};
133142

134143
template<typename BlueprintFieldType, typename ArithmetizationParams>
@@ -156,6 +165,23 @@ namespace nil {
156165
component, start_row_index);
157166
}
158167

168+
template<typename BlueprintFieldType, typename ArithmetizationParams>
169+
typename plonk_native_addition<BlueprintFieldType, ArithmetizationParams>::result_type
170+
generate_empty_assignments(
171+
const plonk_native_addition<BlueprintFieldType, ArithmetizationParams> &component,
172+
assignment<crypto3::zk::snark::plonk_constraint_system<BlueprintFieldType, ArithmetizationParams>>
173+
&assignment,
174+
const typename plonk_native_addition<BlueprintFieldType, ArithmetizationParams>::input_type
175+
instance_input,
176+
const std::uint32_t start_row_index) {
177+
178+
using component_type = plonk_native_addition<BlueprintFieldType, ArithmetizationParams>;
179+
assignment.witness(component.W(2), start_row_index) = component_type::calculate(
180+
var_value(assignment, instance_input.x), var_value(assignment, instance_input.y));
181+
return typename plonk_native_addition<BlueprintFieldType, ArithmetizationParams>::result_type(
182+
component, start_row_index);
183+
}
184+
159185
template<typename BlueprintFieldType, typename ArithmetizationParams>
160186
std::size_t generate_gates(
161187
const plonk_native_addition<BlueprintFieldType, ArithmetizationParams> &component,

include/nil/blueprint/components/algebra/fields/plonk/division.hpp

+26
Original file line numberDiff line numberDiff line change
@@ -85,9 +85,13 @@ namespace nil {
8585
constexpr static std::size_t get_rows_amount(std::size_t witness_amount, std::size_t lookup_column_amount) {
8686
return 1;
8787
}
88+
constexpr static std::size_t get_empty_rows_amount() {
89+
return 1;
90+
}
8891

8992
constexpr static const std::size_t gates_amount = 1;
9093
const std::size_t rows_amount = get_rows_amount(this->witness_amount(), 0);
94+
const std::size_t empty_rows_amount = get_empty_rows_amount();
9195

9296
struct input_type {
9397
var x = var(0, 0, false);
@@ -128,6 +132,11 @@ namespace nil {
128132
std::initializer_list<typename component_type::public_input_container_type::value_type>
129133
public_inputs) :
130134
component_type(witnesses, constants, public_inputs, get_manifest()) {};
135+
136+
static typename BlueprintFieldType::value_type calculate(typename BlueprintFieldType::value_type x,
137+
typename BlueprintFieldType::value_type y) {
138+
return x / y;
139+
}
131140
};
132141

133142
template<typename BlueprintFieldType, typename ArithmetizationParams>
@@ -155,6 +164,23 @@ namespace nil {
155164
component, start_row_index);
156165
}
157166

167+
template<typename BlueprintFieldType, typename ArithmetizationParams>
168+
typename plonk_division<BlueprintFieldType, ArithmetizationParams>::result_type generate_empty_assignments(
169+
const plonk_division<BlueprintFieldType, ArithmetizationParams> &component,
170+
assignment<crypto3::zk::snark::plonk_constraint_system<BlueprintFieldType, ArithmetizationParams>>
171+
&assignment,
172+
const typename plonk_division<BlueprintFieldType, ArithmetizationParams>::input_type instance_input,
173+
const std::uint32_t start_row_index) {
174+
175+
using component_type = plonk_division<BlueprintFieldType, ArithmetizationParams>;
176+
const std::size_t j = start_row_index;
177+
assignment.witness(component.W(2), j) = component_type::calculate(
178+
var_value(assignment, instance_input.x), var_value(assignment, instance_input.y));
179+
180+
return typename plonk_division<BlueprintFieldType, ArithmetizationParams>::result_type(
181+
component, start_row_index);
182+
}
183+
158184
template<typename BlueprintFieldType, typename ArithmetizationParams>
159185
std::size_t generate_gates(
160186
const plonk_division<BlueprintFieldType, ArithmetizationParams> &component,

include/nil/blueprint/components/algebra/fields/plonk/division_or_zero.hpp

+25
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,13 @@ namespace nil {
7373
std::size_t lookup_column_amount) {
7474
return 1;
7575
}
76+
constexpr static std::size_t get_empty_rows_amount() {
77+
return 1;
78+
}
7679

7780
constexpr static const std::size_t gates_amount = 1;
7881
const std::size_t rows_amount = get_rows_amount(this->witness_amount(), 0);
82+
const std::size_t empty_rows_amount = get_empty_rows_amount();
7983

8084
using var = typename component_type::var;
8185
using manifest_type = plonk_component_manifest;
@@ -129,6 +133,11 @@ namespace nil {
129133
std::initializer_list<
130134
typename component_type::public_input_container_type::value_type> public_inputs):
131135
component_type(witnesses, constants, public_inputs, get_manifest()){};
136+
137+
static typename BlueprintFieldType::value_type calculate(typename BlueprintFieldType::value_type x,
138+
typename BlueprintFieldType::value_type y) {
139+
return (y == 0) ? 0 : x / y;
140+
}
132141
};
133142

134143
template<typename BlueprintFieldType, typename ArithmetizationParams>
@@ -162,6 +171,22 @@ namespace nil {
162171
return typename plonk_division_or_zero<BlueprintFieldType, ArithmetizationParams>::result_type(component, start_row_index);
163172
}
164173

174+
template<typename BlueprintFieldType,
175+
typename ArithmetizationParams>
176+
typename plonk_division_or_zero<BlueprintFieldType, ArithmetizationParams>::result_type
177+
generate_empty_assignments(
178+
const plonk_division_or_zero<BlueprintFieldType, ArithmetizationParams> &component,
179+
assignment<crypto3::zk::snark::plonk_constraint_system<BlueprintFieldType, ArithmetizationParams>> &assignment,
180+
const typename plonk_division_or_zero<BlueprintFieldType, ArithmetizationParams>::input_type instance_input,
181+
const std::uint32_t start_row_index) {
182+
183+
using component_type = plonk_division_or_zero<BlueprintFieldType, ArithmetizationParams>;
184+
assignment.witness(component.W(2), start_row_index) = component_type::calculate(
185+
var_value(assignment, instance_input.x), var_value(assignment, instance_input.y));
186+
187+
return typename plonk_division_or_zero<BlueprintFieldType, ArithmetizationParams>::result_type(component, start_row_index);
188+
}
189+
165190
template<typename BlueprintFieldType,
166191
typename ArithmetizationParams>
167192
std::size_t generate_gates(

include/nil/blueprint/components/algebra/fields/plonk/multiplication.hpp

+27
Original file line numberDiff line numberDiff line change
@@ -87,9 +87,13 @@ namespace nil {
8787
std::size_t lookup_column_amount) {
8888
return 1;
8989
}
90+
constexpr static std::size_t get_empty_rows_amount() {
91+
return 1;
92+
}
9093

9194
constexpr static const std::size_t gates_amount = 1;
9295
const std::size_t rows_amount = get_rows_amount(this->witness_amount(), 0);
96+
const std::size_t empty_rows_amount = get_empty_rows_amount();
9397

9498
struct input_type {
9599
var x = var(0, 0, false);
@@ -131,6 +135,11 @@ namespace nil {
131135
std::initializer_list<typename component_type::public_input_container_type::value_type>
132136
public_inputs) :
133137
component_type(witnesses, constants, public_inputs, get_manifest()) {};
138+
139+
static typename BlueprintFieldType::value_type calculate(typename BlueprintFieldType::value_type x,
140+
typename BlueprintFieldType::value_type y) {
141+
return x * y;
142+
}
134143
};
135144

136145
template<typename BlueprintFieldType, typename ArithmetizationParams>
@@ -158,6 +167,24 @@ namespace nil {
158167
component, start_row_index);
159168
}
160169

170+
template<typename BlueprintFieldType, typename ArithmetizationParams>
171+
typename plonk_multiplication<BlueprintFieldType, ArithmetizationParams>::result_type
172+
generate_empty_assignments(
173+
const plonk_multiplication<BlueprintFieldType, ArithmetizationParams> &component,
174+
assignment<crypto3::zk::snark::plonk_constraint_system<BlueprintFieldType, ArithmetizationParams>>
175+
&assignment,
176+
const typename plonk_multiplication<BlueprintFieldType, ArithmetizationParams>::input_type
177+
instance_input,
178+
const std::uint32_t start_row_index) {
179+
180+
using component_type = plonk_multiplication<BlueprintFieldType, ArithmetizationParams>;
181+
const std::size_t j = start_row_index;
182+
assignment.witness(component.W(2), j) = component_type::calculate(
183+
var_value(assignment, instance_input.x), var_value(assignment, instance_input.y));
184+
return typename plonk_multiplication<BlueprintFieldType, ArithmetizationParams>::result_type(
185+
component, start_row_index);
186+
}
187+
161188
template<typename BlueprintFieldType, typename ArithmetizationParams>
162189
std::size_t generate_gates(
163190
const plonk_multiplication<BlueprintFieldType, ArithmetizationParams> &component,

include/nil/blueprint/components/algebra/fields/plonk/multiplication_by_constant.hpp

+24
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ namespace nil {
7373

7474
static constexpr const std::size_t gates_amount = 1;
7575
const std::size_t rows_amount = get_rows_amount(this->witness_amount(), 0);
76+
const std::size_t empty_rows_amount = get_empty_rows_amount();
7677

7778
using var = typename component_type::var;
7879
using value_type = typename BlueprintFieldType::value_type;
@@ -90,6 +91,9 @@ namespace nil {
9091
std::size_t lookup_column_amount) {
9192
return 1;
9293
}
94+
constexpr static std::size_t get_empty_rows_amount() {
95+
return 1;
96+
}
9397

9498
value_type constant;
9599

@@ -132,6 +136,11 @@ namespace nil {
132136
value_type constant_):
133137
component_type(witnesses, constants, public_inputs, get_manifest()),
134138
constant(constant_) {};
139+
140+
static typename BlueprintFieldType::value_type calculate(typename BlueprintFieldType::value_type x,
141+
typename BlueprintFieldType::value_type constant) {
142+
return x * constant;
143+
}
135144
};
136145

137146
template<typename BlueprintFieldType, typename ArithmetizationParams>
@@ -157,6 +166,21 @@ namespace nil {
157166
return typename plonk_mul_by_constant<BlueprintFieldType, ArithmetizationParams>::result_type(component, start_row_index);
158167
}
159168

169+
template<typename BlueprintFieldType,
170+
typename ArithmetizationParams>
171+
typename plonk_mul_by_constant<BlueprintFieldType, ArithmetizationParams>::result_type
172+
generate_empty_assignments(
173+
const plonk_mul_by_constant<BlueprintFieldType, ArithmetizationParams> &component,
174+
assignment<crypto3::zk::snark::plonk_constraint_system<BlueprintFieldType, ArithmetizationParams>> &assignment,
175+
const typename plonk_mul_by_constant<BlueprintFieldType, ArithmetizationParams>::input_type instance_input,
176+
const std::uint32_t start_row_index) {
177+
178+
using component_type = plonk_mul_by_constant<BlueprintFieldType, ArithmetizationParams>;
179+
assignment.witness(component.W(1), start_row_index) = component_type::calculate(var_value(assignment, instance_input.x), component.constant);
180+
181+
return typename plonk_mul_by_constant<BlueprintFieldType, ArithmetizationParams>::result_type(component, start_row_index);
182+
}
183+
160184
template<typename BlueprintFieldType,
161185
typename ArithmetizationParams>
162186
std::size_t generate_gates(

include/nil/blueprint/components/algebra/fields/plonk/subtraction.hpp

+26
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,13 @@ namespace nil {
7575
std::size_t lookup_column_amount) {
7676
return 1;
7777
}
78+
constexpr static std::size_t get_empty_rows_amount() {
79+
return 1;
80+
}
7881

7982
constexpr static const std::size_t gates_amount = 1;
8083
const std::size_t rows_amount = get_rows_amount(this->witness_amount(), 0);
84+
const std::size_t empty_rows_amount = get_empty_rows_amount();
8185

8286
using var = typename component_type::var;
8387
using manifest_type = plonk_component_manifest;
@@ -130,6 +134,11 @@ namespace nil {
130134
std::initializer_list<typename component_type::public_input_container_type::value_type>
131135
public_inputs) :
132136
component_type(witnesses, constants, public_inputs, get_manifest()) {};
137+
138+
static typename BlueprintFieldType::value_type calculate(typename BlueprintFieldType::value_type x,
139+
typename BlueprintFieldType::value_type y) {
140+
return x - y;
141+
}
133142
};
134143

135144
template<typename BlueprintFieldType, typename ArithmetizationParams>
@@ -156,6 +165,23 @@ namespace nil {
156165
component, start_row_index);
157166
}
158167

168+
template<typename BlueprintFieldType, typename ArithmetizationParams>
169+
typename plonk_subtraction<BlueprintFieldType, ArithmetizationParams>::result_type
170+
generate_empty_assignments(
171+
const plonk_subtraction<BlueprintFieldType, ArithmetizationParams> &component,
172+
assignment<crypto3::zk::snark::plonk_constraint_system<BlueprintFieldType, ArithmetizationParams>>
173+
&assignment,
174+
const typename plonk_subtraction<BlueprintFieldType, ArithmetizationParams>::input_type
175+
instance_input,
176+
const std::uint32_t start_row_index) {
177+
178+
using component_type = plonk_subtraction<BlueprintFieldType, ArithmetizationParams>;
179+
assignment.witness(component.W(2), start_row_index) = component_type::calculate(
180+
var_value(assignment, instance_input.x), var_value(assignment, instance_input.y));
181+
return typename plonk_subtraction<BlueprintFieldType, ArithmetizationParams>::result_type(
182+
component, start_row_index);
183+
}
184+
159185
template<typename BlueprintFieldType, typename ArithmetizationParams>
160186
std::size_t generate_gates(
161187
const plonk_subtraction<BlueprintFieldType, ArithmetizationParams> &component,

test/algebra/fields/plonk/field_operations.cpp

+6
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ void test_add(std::vector<typename FieldType::value_type> public_input){
8686
component_type component_instance({0, 1, 2},{},{});
8787

8888
nil::crypto3::test_component<component_type, BlueprintFieldType, ArithmetizationParams, hash_type, Lambda> (component_instance, public_input, result_check, instance_input);
89+
nil::crypto3::test_empty_component<component_type, BlueprintFieldType, ArithmetizationParams, hash_type, Lambda> (component_instance, public_input, result_check, instance_input);
8990
}
9091

9192
template <typename FieldType>
@@ -125,6 +126,7 @@ void test_sub(std::vector<typename FieldType::value_type> public_input){
125126
component_type component_instance({0, 1, 2},{},{});
126127

127128
nil::crypto3::test_component<component_type, BlueprintFieldType, ArithmetizationParams, hash_type, Lambda> (component_instance, public_input, result_check, instance_input);
129+
nil::crypto3::test_empty_component<component_type, BlueprintFieldType, ArithmetizationParams, hash_type, Lambda> (component_instance, public_input, result_check, instance_input);
128130
}
129131

130132
template <typename FieldType>
@@ -164,6 +166,7 @@ void test_mul(std::vector<typename FieldType::value_type> public_input){
164166
component_type component_instance({0, 1, 2},{},{});
165167

166168
nil::crypto3::test_component<component_type, BlueprintFieldType, ArithmetizationParams, hash_type, Lambda> (component_instance, public_input, result_check, instance_input);
169+
nil::crypto3::test_empty_component<component_type, BlueprintFieldType, ArithmetizationParams, hash_type, Lambda> (component_instance, public_input, result_check, instance_input);
167170
}
168171

169172
template <typename FieldType>
@@ -204,6 +207,7 @@ void test_mul_by_const(std::vector<typename FieldType::value_type> public_input,
204207
component_type component_instance({0, 1},{0},{},y);
205208

206209
nil::crypto3::test_component<component_type, BlueprintFieldType, ArithmetizationParams, hash_type, Lambda> (component_instance, public_input, result_check, instance_input);
210+
nil::crypto3::test_empty_component<component_type, BlueprintFieldType, ArithmetizationParams, hash_type, Lambda> (component_instance, public_input, result_check, instance_input);
207211
}
208212

209213
template <typename FieldType>
@@ -236,6 +240,7 @@ void test_div(std::vector<typename FieldType::value_type> public_input,
236240
component_type component_instance({0, 1, 2, 3},{},{});
237241

238242
nil::crypto3::test_component<component_type, BlueprintFieldType, ArithmetizationParams, hash_type, Lambda> (component_instance, public_input, result_check, instance_input);
243+
nil::crypto3::test_empty_component<component_type, BlueprintFieldType, ArithmetizationParams, hash_type, Lambda> (component_instance, public_input, result_check, instance_input);
239244
}
240245

241246
template <typename FieldType>
@@ -280,6 +285,7 @@ void test_div_or_zero(std::vector<typename FieldType::value_type> public_input){
280285
component_type component_instance({0, 1, 2, 3, 4},{},{});
281286

282287
nil::crypto3::test_component<component_type, BlueprintFieldType, ArithmetizationParams, hash_type, Lambda> (component_instance, public_input, result_check, instance_input);
288+
nil::crypto3::test_empty_component<component_type, BlueprintFieldType, ArithmetizationParams, hash_type, Lambda> (component_instance, public_input, result_check, instance_input);
283289
}
284290

285291
template <typename FieldType>

0 commit comments

Comments
 (0)