source: comparacioncriptosistemas/reescrituraDeCodigo/fieldnumber.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: 5.4 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 e implementación de una plantilla de clase
24  para representar números enteros restringidos a un campo finito.
25
26  Creado por:        Alejandro J. Mujica
27  Fecha de creación:
28*/
29
30
31# ifndef FIELDNUMBER_H
32# define FIELDNUMBER_H
33
34# include <iostream>
35
36/**
37 * Plantilla que representa un número restringido a un campo.
38 *
39 * @tparam FieldT Tipo de campo a utilizar.
40 *
41 * @pre FieldT debe ser base de la plantilla FiniteField.
42 *
43 * @see FiniteField FiniteField2.
44 *
45 * @author Alejandro J. Mujica (amujica en cenditel punto gob punto ve).
46 */
47template <class FieldT>
48class FieldNumber
49{
50public:
51  /// Tipo de campo que restringe al número.
52  using FieldType = FieldT;
53  /// Tipo de número restringido.
54  using NumberType = typename FieldType::NumberType;
55
56private:
57  FieldType  field;
58
59  NumberType value;
60
61public:
62  /// Constructor que funge de paramétrico y por omisión.
63  FieldNumber(const NumberType & _value = NumberType(0));
64
65  FieldNumber operator + (const FieldNumber &) const;
66
67  FieldNumber & operator += (const FieldNumber &);
68
69  FieldNumber operator - (const FieldNumber &) const;
70
71  FieldNumber & operator -= (const FieldNumber &);
72
73  FieldNumber operator * (const FieldNumber &) const;
74
75  FieldNumber & operator *= (const FieldNumber &);
76
77  FieldNumber operator / (const FieldNumber &) const;
78
79  FieldNumber & operator /= (const FieldNumber &);
80
81  bool operator == (const FieldNumber &) const;
82
83  bool operator != (const FieldNumber &) const;
84
85  bool operator < (const FieldNumber &) const;
86
87  bool operator <= (const FieldNumber &) const;
88
89  bool operator > (const FieldNumber &) const;
90 
91  bool operator >= (const FieldNumber &) const;
92
93  bool operator ! () const;
94
95  friend std::ostream & operator << (std::ostream & out, const FieldNumber & fn)
96  {
97    out << (NumberType) fn.value;
98    return out;
99  }
100
101  FieldNumber & operator ++ ();
102
103  FieldNumber & operator -- ();
104
105  /// Operador de casting para el tipo numérico base.
106  operator NumberType & ()
107  {
108    return value;
109  }
110};
111
112template <class FieldT>
113FieldNumber<FieldT>::FieldNumber(const NumberType & _value)
114  : field(), value(field(_value))
115{
116  // Empty
117}
118
119template <class FieldT> FieldNumber<FieldT>
120FieldNumber<FieldT>::operator + (const FieldNumber & fn) const
121{
122  FieldNumber ret;
123  ret.value = field.sum(value, fn.value);
124  return ret;
125}
126
127template <class FieldT> FieldNumber<FieldT> &
128FieldNumber<FieldT>::operator += (const FieldNumber & fn)
129{
130  *this = *this + fn;
131  return *this;
132}
133
134template <class FieldT> FieldNumber<FieldT>
135FieldNumber<FieldT>::operator - (const FieldNumber & fn) const
136{
137  FieldNumber ret;
138  ret.value = field.sub(value, fn.value);
139  return ret;
140}
141
142template <class FieldT> FieldNumber<FieldT> &
143FieldNumber<FieldT>::operator -= (const FieldNumber & fn)
144{
145  *this = *this - fn;
146  return *this;
147}
148
149template <class FieldT> FieldNumber<FieldT>
150FieldNumber<FieldT>::operator * (const FieldNumber & fn) const
151
152{
153  FieldNumber ret;
154  ret.value = field.mul(value, fn.value);
155  return ret;
156}
157
158template <class FieldT> FieldNumber<FieldT> &
159FieldNumber<FieldT>::operator *= (const FieldNumber & fn)
160{
161  *this = *this * fn;
162  return *this;
163}
164
165template <class FieldT> FieldNumber<FieldT>
166FieldNumber<FieldT>::operator / (const FieldNumber & fn) const
167{
168  FieldNumber ret;
169  ret.value = field.div(value, fn.value);
170  return ret;
171}
172
173template <class FieldT> FieldNumber<FieldT> &
174FieldNumber<FieldT>::operator /= (const FieldNumber & fn)
175{
176  *this = *this / fn;
177  return *this;
178}
179
180template <class FieldT> bool
181FieldNumber<FieldT>::operator == (const FieldNumber & fn) const
182{
183  return value == fn.value;
184}
185
186template <class FieldT> bool
187FieldNumber<FieldT>::operator != (const FieldNumber & fn) const
188{
189  return not (*this == fn);
190}
191
192template <class FieldT>
193bool FieldNumber<FieldT>::operator < (const FieldNumber & fn) const
194{
195  return value < fn.value;
196}
197
198template <class FieldT>
199bool FieldNumber<FieldT>::operator <= (const FieldNumber & fn) const
200{
201  return value <= fn.value;
202}
203
204template <class FieldT>
205bool FieldNumber<FieldT>::operator > (const FieldNumber & fn) const
206{
207  return value > fn.value;
208}
209
210template <class FieldT>
211bool FieldNumber<FieldT>::operator >= (const FieldNumber & fn) const
212{
213  return value >= fn.value;
214}
215
216template <class FieldT>
217bool FieldNumber<FieldT>::operator ! () const
218{
219  return value == NumberType(0);
220}
221
222template <class FieldT> FieldNumber<FieldT> &
223FieldNumber<FieldT>::operator ++ ()
224{
225  value = field.sum(value, 1);
226  return *this;
227}
228
229template <class FieldT> FieldNumber<FieldT> &
230FieldNumber<FieldT>::operator -- ()
231{
232  value = field.sub(value, 1);
233  return *this;
234}
235
236# endif // FIELD_NUMBER_H
237
Note: See TracBrowser for help on using the repository browser.