Skip to content

Commit

Permalink
remove input zero vector
Browse files Browse the repository at this point in the history
  • Loading branch information
AntoineCyr committed Feb 12, 2025
1 parent 213639a commit 87e57d0
Show file tree
Hide file tree
Showing 15 changed files with 236 additions and 251 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,7 @@ namespace nil {
// Expects input as k-chunked values with b bits per chunk
// p' = 2^(kb) - p
// Input: xQ[0],...,xQ[k-1], yQ[0],...,yQ[k-1], p[0],...,p[k-1],
// pp[0],...,pp[k-1], 0[0], ..., 0[k-1]
// (expects zero vector constant as input)
// pp[0],...,pp[k-1], 0 (expects zero constant as input)
// Output: xR[0],...,xR[k-1], yR[0],...,yR[k-1]

template<typename FieldType>
Expand All @@ -58,7 +57,7 @@ namespace nil {
std::vector<TYPE> yQ;
std::vector<TYPE> p;
std::vector<TYPE> pp;
std::vector<TYPE> zero;
TYPE zero;
};

template<typename FieldType, GenerationStage stage,
Expand Down Expand Up @@ -93,23 +92,24 @@ namespace nil {
}

static std::tuple<std::vector<TYPE>, std::vector<TYPE>,
std::vector<TYPE>, std::vector<TYPE>, std::vector<TYPE>>
std::vector<TYPE>, std::vector<TYPE>,
TYPE>
form_input(context_type& context_object, raw_input_type raw_input,
std::size_t num_chunks, std::size_t bit_size_chunk) {
std::vector<TYPE> input_xQ(num_chunks);
std::vector<TYPE> input_yQ(num_chunks);
std::vector<TYPE> input_p(num_chunks);
std::vector<TYPE> input_pp(num_chunks);
std::vector<TYPE> input_zero(num_chunks);
TYPE input_zero;

if constexpr (stage == GenerationStage::ASSIGNMENT) {
for (std::size_t i = 0; i < num_chunks; i++) {
input_xQ[i] = raw_input.xQ[i];
input_yQ[i] = raw_input.yQ[i];
input_p[i] = raw_input.p[i];
input_pp[i] = raw_input.pp[i];
input_zero[i] = raw_input.zero[i];
}
input_zero = raw_input.zero;
}
for (std::size_t i = 0; i < num_chunks; i++) {
context_object.allocate(input_xQ[i], 0, i,
Expand All @@ -120,16 +120,16 @@ namespace nil {
column_type::public_input);
context_object.allocate(input_pp[i], 0, i + 3 * num_chunks,
column_type::public_input);
context_object.allocate(input_zero[i], 0, i + 4 * num_chunks,
column_type::public_input);
}
context_object.allocate(input_zero, 0, 4 * num_chunks,
column_type::public_input);
return std::make_tuple(input_xQ, input_yQ, input_p, input_pp,
input_zero);
}

ec_double(context_type& context_object, std::vector<TYPE> input_xQ,
std::vector<TYPE> input_yQ, std::vector<TYPE> input_p,
std::vector<TYPE> input_pp, std::vector<TYPE> input_zero,
std::vector<TYPE> input_pp, TYPE input_zero,
std::size_t num_chunks, std::size_t bit_size_chunk,
bool make_links = true)
: generic_component<FieldType, stage>(context_object) {
Expand Down Expand Up @@ -211,8 +211,9 @@ namespace nil {
input_pp, input_zero](std::vector<TYPE> x) {
Range_Check rc = Range_Check(context_object, x, num_chunks,
bit_size_chunk);
Check_Mod_P cm = Check_Mod_P(context_object, x, input_pp, input_zero[0],
num_chunks, bit_size_chunk);
Check_Mod_P cm =
Check_Mod_P(context_object, x, input_pp, input_zero,
num_chunks, bit_size_chunk);
};

// Copy constraint generation lambda expression
Expand All @@ -229,46 +230,47 @@ namespace nil {
check_chunked(XR);
check_chunked(YR);

auto MultModP = [&context_object, input_p, input_pp, input_zero, num_chunks,
bit_size_chunk](std::vector<TYPE> x,
std::vector<TYPE> y) {
Multiplication_Mod_P t =
Multiplication_Mod_P(context_object, x, y, input_p, input_pp, input_zero[0],
num_chunks, bit_size_chunk);
auto MultModP = [&context_object, input_p, input_pp, input_zero,
num_chunks, bit_size_chunk](
std::vector<TYPE> x, std::vector<TYPE> y) {
Multiplication_Mod_P t = Multiplication_Mod_P(
context_object, x, y, input_p, input_pp, input_zero,
num_chunks, bit_size_chunk);
return t.r;
};
auto AddModP = [&context_object, input_p, input_pp, input_zero, num_chunks,
bit_size_chunk](std::vector<TYPE> x,
std::vector<TYPE> y) {
auto AddModP = [&context_object, input_p, input_pp, input_zero,
num_chunks, bit_size_chunk](std::vector<TYPE> x,
std::vector<TYPE> y) {
Addition_Mod_P t =
Addition_Mod_P(context_object, x, y, input_p, input_pp, input_zero,
num_chunks, bit_size_chunk);
Addition_Mod_P(context_object, x, y, input_p, input_pp,
input_zero, num_chunks, bit_size_chunk);
return t.r;
};
auto NegModP = [&context_object, input_p, input_pp, input_zero, num_chunks,
bit_size_chunk](std::vector<TYPE> x) {
auto NegModP = [&context_object, input_p, input_pp, input_zero,
num_chunks, bit_size_chunk](std::vector<TYPE> x) {
Negation_Mod_P t =
Negation_Mod_P(context_object, x, input_p, input_pp, input_zero, num_chunks,
bit_size_chunk);
Negation_Mod_P(context_object, x, input_p, input_pp,
input_zero, num_chunks, bit_size_chunk);
return t.r;
};

auto t1 = MultModP(input_yQ,LAMBDA); // t1 = yQ * lambda
auto t2 = AddModP(t1,t1); // t2 = t1 + t1 = 2yQ * lambda
auto t3 = AddModP(input_xQ,input_xQ); // t3 = xQ + xQ = 2xQ
auto t4 = AddModP(input_xQ,t3); // t4 = xQ + t3 = 3xQ
auto t5 = MultModP(t4,input_xQ); // t5 = t4 * xQ = 3xQ^2
CopyConstrain(t2, t5); // 2yQ lambda = 3xQ^2
auto t6 = AddModP(XR,t3); // t6 = xR + t3 = xR + 2xQ
auto t7 = MultModP(LAMBDA,LAMBDA); // t7 = lambda * lambda
CopyConstrain(t6, t7); // xR + 2xQ = lambda^2
auto t8 = AddModP(YR,input_yQ); // t8 = yR + yQ
auto t1 = MultModP(input_yQ, LAMBDA); // t1 = yQ * lambda
auto t2 = AddModP(t1, t1); // t2 = t1 + t1 = 2yQ * lambda
auto t3 = AddModP(input_xQ, input_xQ); // t3 = xQ + xQ = 2xQ
auto t4 = AddModP(input_xQ, t3); // t4 = xQ + t3 = 3xQ
auto t5 = MultModP(t4, input_xQ); // t5 = t4 * xQ = 3xQ^2
CopyConstrain(t2, t5); // 2yQ lambda = 3xQ^2
auto t6 = AddModP(XR, t3); // t6 = xR + t3 = xR + 2xQ
auto t7 = MultModP(LAMBDA, LAMBDA); // t7 = lambda * lambda
CopyConstrain(t6, t7); // xR + 2xQ = lambda^2
auto t8 = AddModP(YR, input_yQ); // t8 = yR + yQ
auto t9 = NegModP(XR); // t9 = -xR
auto t10 = AddModP(input_xQ,t9); // t10 = xQ + t9 = xQ - xR
auto t11 = MultModP(LAMBDA,t10); // t11 = lambda * t10 =lambda(xQ-xR)
CopyConstrain(t8, t11); // yR + yQ = lambda(xQ - xR)
auto t12 = MultModP(Z,t1); // t12 = z * t1 = z * yQ * lambda
CopyConstrain(LAMBDA, t12); // lambda = z yQ lambda
auto t10 = AddModP(input_xQ, t9); // t10 = xQ + t9 = xQ - xR
auto t11 =
MultModP(LAMBDA, t10); // t11 = lambda * t10 =lambda(xQ-xR)
CopyConstrain(t8, t11); // yR + yQ = lambda(xQ - xR)
auto t12 = MultModP(Z, t1); // t12 = z * t1 = z * yQ * lambda
CopyConstrain(LAMBDA, t12); // lambda = z yQ lambda

for (int i = 0; i < num_chunks; ++i) {
xR.push_back(XR[i]);
Expand Down
Loading

0 comments on commit 87e57d0

Please sign in to comment.