27 #ifndef CRYPTO3_ALGEBRA_CURVES_SCALAR_MUL_HPP
28 #define CRYPTO3_ALGEBRA_CURVES_SCALAR_MUL_HPP
32 #include <nil/crypto3/multiprecision/number.hpp>
33 #include <nil/crypto3/multiprecision/modular/modular_adaptor.hpp>
42 template<
typename GroupValueType,
44 multiprecision::expression_template_option ExpressionTemplates>
45 constexpr GroupValueType
47 const multiprecision::number<Backend, ExpressionTemplates> &scalar) {
48 if (scalar.is_zero()) {
49 return GroupValueType::zero();
51 GroupValueType result;
53 bool found_one =
false;
54 for (
auto i =
static_cast<std::int64_t
>(multiprecision::msb(scalar)); i >= 0; --i) {
56 result = result.doubled();
59 if (multiprecision::bit_test(scalar, i)) {
61 result = result + base;
68 template<
typename GroupValueType,
69 typename Backend,
typename SafeType,
70 multiprecision::expression_template_option ExpressionTemplates>
71 constexpr GroupValueType
73 const multiprecision::number<nil::crypto3::multiprecision::backends::modular_adaptor<Backend, SafeType>, ExpressionTemplates> &right) {
74 multiprecision::number<Backend, ExpressionTemplates> tmp = right.template convert_to<multiprecision::number<Backend, ExpressionTemplates>>();
78 template<
typename GroupValueType,
80 multiprecision::expression_template_option ExpressionTemplates>
81 constexpr GroupValueType
83 const multiprecision::number<Backend, ExpressionTemplates> &right) {
88 template<
typename GroupValueType,
90 multiprecision::expression_template_option ExpressionTemplates>
91 constexpr GroupValueType
operator*(
const multiprecision::number<Backend, ExpressionTemplates> &left,
92 const GroupValueType &right) {
117 template<
typename GroupValueType,
typename FieldValueType>
118 typename std::enable_if<is_curve_group<typename GroupValueType::group_type>::value &&
122 GroupValueType>::type
123 operator*(
const GroupValueType &left,
const FieldValueType &right) {
125 return left * right.data;
128 template<
typename GroupValueType,
typename FieldValueType>
129 typename std::enable_if<is_curve_group<typename GroupValueType::group_type>::value &&
133 GroupValueType>::type
134 operator*(
const FieldValueType &left,
const GroupValueType &right) {
139 template<
typename GroupValueType>
140 constexpr GroupValueType
operator*(
const GroupValueType &left,
const std::size_t &right) {
142 return scalar_mul(left,
typename GroupValueType::field_type::integral_type::value_type(right));
145 template<
typename GroupValueType>
146 constexpr GroupValueType
operator*(
const std::size_t &left,
const GroupValueType &right) {
constexpr GroupValueType scalar_mul(const GroupValueType &base, const multiprecision::number< Backend, ExpressionTemplates > &scalar)
Definition: algebra/include/nil/crypto3/algebra/curves/detail/scalar_mul.hpp:46
constexpr GroupValueType operator*(const GroupValueType &left, const multiprecision::number< nil::crypto3::multiprecision::backends::modular_adaptor< Backend, SafeType >, ExpressionTemplates > &right)
Definition: algebra/include/nil/crypto3/algebra/curves/detail/scalar_mul.hpp:72
Definition: algebra/include/nil/crypto3/algebra/type_traits.hpp:105
Definition: algebra/include/nil/crypto3/algebra/type_traits.hpp:95