]> Git Repo - secp256k1.git/blame - src/num.h
Merge #701: Make ec_ arithmetic more consistent and add documentation
[secp256k1.git] / src / num.h
CommitLineData
71712b27
GM
1/**********************************************************************
2 * Copyright (c) 2013, 2014 Pieter Wuille *
3 * Distributed under the MIT software license, see the accompanying *
4 * file COPYING or http://www.opensource.org/licenses/mit-license.php.*
5 **********************************************************************/
0a433ea2 6
abe2d3e8
DR
7#ifndef SECP256K1_NUM_H
8#define SECP256K1_NUM_H
b394396b 9
597128d3
PW
10#ifndef USE_NUM_NONE
11
78cd96b1
CF
12#if defined HAVE_CONFIG_H
13#include "libsecp256k1-config.h"
14#endif
15
42f5e7c5 16#if defined(USE_NUM_GMP)
7b292b81 17#include "num_gmp.h"
7b292b81
PW
18#else
19#error "Please select num implementation"
20#endif
b394396b 21
2f9e831d 22/** Copy a number. */
dd891e0e 23static void secp256k1_num_copy(secp256k1_num *r, const secp256k1_num *a);
2f9e831d
PW
24
25/** Convert a number's absolute value to a binary big-endian string.
26 * There must be enough place. */
dd891e0e 27static void secp256k1_num_get_bin(unsigned char *r, unsigned int rlen, const secp256k1_num *a);
2f9e831d
PW
28
29/** Set a number to the value of a binary big-endian string. */
dd891e0e 30static void secp256k1_num_set_bin(secp256k1_num *r, const unsigned char *a, unsigned int alen);
2f9e831d 31
2f9e831d 32/** Compute a modular inverse. The input must be less than the modulus. */
dd891e0e 33static void secp256k1_num_mod_inverse(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *m);
2f9e831d 34
efd953a7
PD
35/** Compute the jacobi symbol (a|b). b must be positive and odd. */
36static int secp256k1_num_jacobi(const secp256k1_num *a, const secp256k1_num *b);
37
2f9e831d 38/** Compare the absolute value of two numbers. */
dd891e0e 39static int secp256k1_num_cmp(const secp256k1_num *a, const secp256k1_num *b);
2f9e831d 40
1a749b4a 41/** Test whether two number are equal (including sign). */
dd891e0e 42static int secp256k1_num_eq(const secp256k1_num *a, const secp256k1_num *b);
1a749b4a 43
2f9e831d 44/** Add two (signed) numbers. */
dd891e0e 45static void secp256k1_num_add(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b);
2f9e831d
PW
46
47/** Subtract two (signed) numbers. */
dd891e0e 48static void secp256k1_num_sub(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b);
2f9e831d
PW
49
50/** Multiply two (signed) numbers. */
dd891e0e 51static void secp256k1_num_mul(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b);
2f9e831d 52
79b0ce6c
PW
53/** Replace a number by its remainder modulo m. M's sign is ignored. The result is a number between 0 and m-1,
54 even if r was negative. */
dd891e0e 55static void secp256k1_num_mod(secp256k1_num *r, const secp256k1_num *m);
2f9e831d 56
ff8746d4 57/** Right-shift the passed number by bits bits. */
dd891e0e 58static void secp256k1_num_shift(secp256k1_num *r, int bits);
2f9e831d
PW
59
60/** Check whether a number is zero. */
dd891e0e 61static int secp256k1_num_is_zero(const secp256k1_num *a);
2f9e831d 62
efd953a7
PD
63/** Check whether a number is one. */
64static int secp256k1_num_is_one(const secp256k1_num *a);
65
2f9e831d 66/** Check whether a number is strictly negative. */
dd891e0e 67static int secp256k1_num_is_neg(const secp256k1_num *a);
2f9e831d 68
2f9e831d 69/** Change a number's sign. */
dd891e0e 70static void secp256k1_num_negate(secp256k1_num *r);
2f9e831d 71
b394396b 72#endif
597128d3 73
abe2d3e8 74#endif /* SECP256K1_NUM_H */
This page took 0.051329 seconds and 4 git commands to generate.