source: comparacioncriptosistemas/reescrituraDeCodigo/finitefield.H

interfaz
Last change on this file was 7576857, checked in by Fundación CENDITEL <cenditel@…>, 8 years ago

Se mueven archivos de reescritura al directorio reescrituraDeCodigo

  • Property mode set to 100644
File size: 4.6 KB
Line 
1/*
2  Copyright (C) 2015
3  Alejandro Mujica (amujica en cenditel.gob.ve)
4  José Angel Contreras (jancontreras en cenditel.gob.ve)
5  Antonio Araujo (aaraujo en cenditel.gob.ve)
6  Pedro Buitrago (pbuitrago en cenditel.gob.ve)
7 
8  CENDITEL Fundación Centro Nacional de Desarrollo e Investigación en
9  Tecnologías Libres
10 
11  Este programa es software libre; Usted puede usarlo bajo los términos de la
12  licencia de software GPL versión 2.0 de la Free Software Foundation.
13 
14  Este programa se distribuye con la esperanza de que sea útil, pero SIN
15  NINGUNA GARANTÍA; tampoco las implícitas garantías de MERCANTILIDAD o
16  ADECUACIÓN A UN PROPÓSITO PARTICULAR.
17  Consulte la licencia GPL para más detalles. Usted debe recibir una copia
18  de la GPL junto con este programa; si no, escriba a la Free Software
19  Foundation Inc. 51 Franklin Street,5 Piso, Boston, MA 02110-1301, USA.
20*/
21
22/*
23  Este archivo contiene la definición de una plantilla para basar
24  implementaciones de campos de Galois (campos finitos).
25
26  Creado por:        Alejandro J. Mujica
27  Fecha de creación:
28*/
29
30# ifndef FINITEFIELD_H
31# define FINITEFIELD_H
32
33# include <random>
34# include <util.H>
35
36/** Plantilla base para crear especializaciones de Campos de Galois.
37 *
38 *  Contiene la interfaz que debe contener una clase particular de campo
39 *  para poder usarla con la clase que representa un número dentro de un campo.
40 *
41 *  @tparam NumberT Tipo numérico que se va a restringir.
42 *  @tparam P Valor constante que define la característica del campo.
43 *  @tparam N Valor constante para la potencia a la cual se elevará la
44 *            característica que definirá el tamaño del campo. Por lo tanto,
45 *            el tamaño del campo estará definido por @f$P^N@f$.
46 *
47 *  @pre NumberT debe ser un tipo de los enteros sin signo de la biblioteca
48 *       estándar de C++
49 *  @pre P > 0
50 *  @pre N >= 0
51 *
52 *  @see FiniteField2 FieldNumber
53 */
54template <typename NumberT, unsigned short P, unsigned short N>
55class FiniteField
56{
57  static_assert(std::is_integral<NumberT>::value and
58                std::is_unsigned<NumberT>::value,
59                "First template argument is not an unsigned integral type");
60  static_assert(P > 0, "P must be greater than 0.");
61  static_assert(N >= 0, "N must be greater or equal than 0.");
62 
63  NumberT field_size;
64 
65public:
66  using NumberType = NumberT;
67
68  FiniteField()
69    : field_size(positive_int_power(P, N))
70  {
71    // Empty
72  }
73
74  /// Retorna la característica del campo.
75  unsigned short characteristic() const
76  {
77    return P;
78  }
79
80  /// Retorna el valor de potencia al cual está elevada la característica.
81  unsigned short power() const
82  {
83    return N;
84  }
85
86  /// Retorna la cardinalidad del campo.
87  NumberT size() const
88  {
89    return field_size;
90  }
91
92  /// Retorna el máximo valor del campo.
93  NumberT max_value() const
94  {
95    return field_size - 1;
96  }
97
98  /// Interfaz para la operación de suma de dos números dentro del campo.
99  virtual NumberType sum(const NumberType &, const NumberType &) const = 0;
100
101  /// Interfaz para la operación de resta de dos números dentro del campo.
102  virtual NumberType sub(const NumberType &, const NumberType &) const = 0;
103
104  /** Interfaz para la operación de multiplicación de dos números dentro del
105      campo.
106  */
107  virtual NumberType mul(const NumberType &, const NumberType &) const = 0;
108
109  /// Interfaz para la operación de división de dos números dentro del campo.
110  virtual NumberType div(const NumberType &, const NumberType &) const = 0;
111
112  /// Interfaz para la operación que retorna el opuesto aditivo de un número.
113  virtual NumberType op(const NumberType &) const = 0;
114
115  /** Interfaz para la operación que retorna el inverso multiplicativo de un
116      número.
117  */
118  virtual NumberType inv(const NumberType &) const = 0;
119
120  /** Genera un número aleatorio dentro del campo.
121   *
122   *  @tparam RandomNumberGenerator Tipo de generador de números aleatorios.
123   *
124   *  @pre RandomNumberGenerator debe ser un un tipo de generador de números
125   *       aleatorios de la biblioteca estándar de C++.
126   *
127   *  @param rng Generador de números aleatorios.
128   *  @return Número aleatorio dentro del campo distribuido uniformemente.
129   */
130  template <class RandomNumberGenerator>
131  NumberType get_random(RandomNumberGenerator & rng) const
132  {
133    std::uniform_int_distribution<NumberType> unif_dist(0, max_value());
134    return unif_dist(rng);
135  }
136
137  /** Trunca un número dentro del campo.
138   *
139   *  @param n Número con cualquier valor.
140   *  @return número dentro del campo.
141   */
142  NumberType operator () (const NumberType & n)
143  {
144    return n % field_size;
145  }
146};
147
148# endif // FINITEFIELD_H
Note: See TracBrowser for help on using the repository browser.