mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-04-22 12:35:14 +00:00
LibCrypto: Add extended GCD algorithm
This commit is contained in:
parent
a74ef5df3d
commit
b35764da0e
Notes:
github-actions[bot]
2024-12-15 22:32:59 +00:00
Author: https://github.com/devgianlu Commit: https://github.com/LadybirdBrowser/ladybird/commit/b35764da0e5 Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/2928
2 changed files with 58 additions and 0 deletions
|
@ -1,6 +1,7 @@
|
|||
/*
|
||||
* Copyright (c) 2020, Ali Mohammad Pur <mpfard@serenityos.org>
|
||||
* Copyright (c) 2020-2021, Dex♪ <dexes.ttp@gmail.com>
|
||||
* Copyright (c) 2024, Altomani Gianluca <altomanigianluca@gmail.com>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
@ -36,4 +37,60 @@ void UnsignedBigIntegerAlgorithms::destructive_GCD_without_allocation(
|
|||
}
|
||||
}
|
||||
|
||||
void UnsignedBigIntegerAlgorithms::extended_GCD_without_allocation(
|
||||
UnsignedBigInteger const& a,
|
||||
UnsignedBigInteger const& b,
|
||||
UnsignedBigInteger& x,
|
||||
UnsignedBigInteger& y,
|
||||
UnsignedBigInteger& gcd,
|
||||
UnsignedBigInteger& temp_quotient,
|
||||
UnsignedBigInteger& temp_1,
|
||||
UnsignedBigInteger& temp_2,
|
||||
UnsignedBigInteger& temp_shift_result,
|
||||
UnsignedBigInteger& temp_shift_plus,
|
||||
UnsignedBigInteger& temp_shift,
|
||||
UnsignedBigInteger& temp_r,
|
||||
UnsignedBigInteger& temp_s,
|
||||
UnsignedBigInteger& temp_t)
|
||||
{
|
||||
gcd.set_to(a);
|
||||
x.set_to(1);
|
||||
y.set_to(0);
|
||||
|
||||
temp_r.set_to(b);
|
||||
temp_s.set_to_0();
|
||||
temp_t.set_to(1);
|
||||
|
||||
while (temp_r != 0) {
|
||||
// quotient := old_r div r
|
||||
divide_without_allocation(gcd, temp_r, temp_quotient, temp_1);
|
||||
|
||||
temp_2.set_to(temp_r);
|
||||
multiply_without_allocation(temp_quotient, temp_r, temp_shift_result, temp_shift_plus, temp_shift, temp_1);
|
||||
while (gcd < temp_1) {
|
||||
add_into_accumulator_without_allocation(gcd, b);
|
||||
}
|
||||
subtract_without_allocation(gcd, temp_1, temp_r);
|
||||
gcd.set_to(temp_2);
|
||||
|
||||
// (old_s, s) := (s, old_s − quotient × s)
|
||||
temp_2.set_to(temp_s);
|
||||
multiply_without_allocation(temp_quotient, temp_s, temp_shift_result, temp_shift_plus, temp_shift, temp_1);
|
||||
while (x < temp_1) {
|
||||
add_into_accumulator_without_allocation(x, b);
|
||||
}
|
||||
subtract_without_allocation(x, temp_1, temp_s);
|
||||
x.set_to(temp_2);
|
||||
|
||||
// (old_t, t) := (t, old_t − quotient × t)
|
||||
temp_2.set_to(temp_t);
|
||||
multiply_without_allocation(temp_quotient, temp_t, temp_shift_result, temp_shift_plus, temp_shift, temp_1);
|
||||
while (y < temp_1) {
|
||||
add_into_accumulator_without_allocation(y, b);
|
||||
}
|
||||
subtract_without_allocation(y, temp_1, temp_t);
|
||||
y.set_to(temp_2);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -27,6 +27,7 @@ public:
|
|||
static void divide_without_allocation(UnsignedBigInteger const& numerator, UnsignedBigInteger const& denominator, UnsignedBigInteger& quotient, UnsignedBigInteger& remainder);
|
||||
static void divide_u16_without_allocation(UnsignedBigInteger const& numerator, UnsignedBigInteger::Word denominator, UnsignedBigInteger& quotient, UnsignedBigInteger& remainder);
|
||||
|
||||
static void extended_GCD_without_allocation(UnsignedBigInteger const& a, UnsignedBigInteger const& b, UnsignedBigInteger& x, UnsignedBigInteger& y, UnsignedBigInteger& gcd, UnsignedBigInteger& temp_quotient, UnsignedBigInteger& temp_1, UnsignedBigInteger& temp_2, UnsignedBigInteger& temp_shift_result, UnsignedBigInteger& temp_shift_plus, UnsignedBigInteger& temp_shift, UnsignedBigInteger& temp_r, UnsignedBigInteger& temp_s, UnsignedBigInteger& temp_t);
|
||||
static void destructive_GCD_without_allocation(UnsignedBigInteger& temp_a, UnsignedBigInteger& temp_b, UnsignedBigInteger& temp_quotient, UnsignedBigInteger& temp_remainder, UnsignedBigInteger& output);
|
||||
static void modular_inverse_without_allocation(UnsignedBigInteger const& a_, UnsignedBigInteger const& b, UnsignedBigInteger& temp_1, UnsignedBigInteger& temp_minus, UnsignedBigInteger& temp_quotient, UnsignedBigInteger& temp_d, UnsignedBigInteger& temp_u, UnsignedBigInteger& temp_v, UnsignedBigInteger& temp_x, UnsignedBigInteger& result);
|
||||
static void destructive_modular_power_without_allocation(UnsignedBigInteger& ep, UnsignedBigInteger& base, UnsignedBigInteger const& m, UnsignedBigInteger& temp_1, UnsignedBigInteger& temp_2, UnsignedBigInteger& temp_3, UnsignedBigInteger& temp_multiply, UnsignedBigInteger& temp_quotient, UnsignedBigInteger& temp_remainder, UnsignedBigInteger& result);
|
||||
|
|
Loading…
Add table
Reference in a new issue