Aleph-w 3.0
A C++ Library for Data Structures and Algorithms
Loading...
Searching...
No Matches
polinom.C
Go to the documentation of this file.
1
2
3/*
4 Aleph_w
5
6 Data structures & Algorithms
7 version 2.0.0b
8 https://github.com/lrleon/Aleph-w
9
10 This file is part of Aleph-w library
11
12 Copyright (c) 2002-2026 Leandro Rabindranath Leon
13
14 Permission is hereby granted, free of charge, to any person obtaining a copy
15 of this software and associated documentation files (the "Software"), to deal
16 in the Software without restriction, including without limitation the rights
17 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
18 copies of the Software, and to permit persons to whom the Software is
19 furnished to do so, subject to the following conditions:
20
21 The above copyright notice and this permission notice shall be included in all
22 copies or substantial portions of the Software.
23
24 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
25 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
26 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
27 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
28 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
29 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
30 SOFTWARE.
31*/
32
33
273# include <tpl_dynDlist.H>
274
276{
277 struct Termino
278 {
279 int coef;
280 size_t pot;
281 Termino() : coef(0), pot(0) {}
282
283 Termino(const int & c, const size_t & p) : coef(c), pot(p) {}
285 {
286
287 assert(pot == der.pot);
288
289 if (this == &der)
290 return *this;
291
292 coef += der.coef;
293 return *this;
294 }
296 {
297 return Termino(coef*der.coef, pot + der.pot);
298 }
299 };
302 {
303 terminos.append(termino);
304 }
306 {
307 Polinomio result;
308 if (terminos.is_empty() or term.coef == 0)
309 return result;
310
312 it.has_curr(); it.next())
313 result.terminos.append(Termino(it.get_curr().coef * term.coef,
314 it.get_curr().pot + term.pot) );
315 return result;
316 }
317
318public:
319
320 Polinomio();
321 Polinomio(const int& coef, const size_t & pot);
322 Polinomio operator + (const Polinomio&) const;
324 Polinomio operator * (const Polinomio&) const;
326
328
330 const size_t & size() const;
331 size_t get_power(const size_t & i) const;
332 const int & get_coef(const size_t & i) const;
333 const size_t & get_degree() const;
334 void print() const
335 {
336 if (terminos.is_empty())
337 {
338 printf("0\n\n");
339 return;
340 }
343 it.has_curr(); it.next())
344 {
345 current_term = it.get_curr();
346 printf(" %c ", current_term.coef < 0 ? '-' : '+');
347
348 if (abs(current_term.coef) not_eq 1)
349 printf("%u", abs(current_term.coef));
350
351 printf("X^%zu", current_term.pot);
352 }
353
354 printf("\n\n");
355 }
356};
357Polinomio::Polinomio(const int & coef, const size_t & pot)
358{
359 terminos.append(Termino(coef, pot));
360}
361Polinomio::Polinomio() { /* empty */ }
363{
364 Polinomio ret_val(*this); // valor de retorno operando derecho
365 ret_val += der; // súmele operando derecho
366 return ret_val;
367}
369{
370 if (der.terminos.is_empty())
371 return *this;
372
373 if (terminos.is_empty())
374 {
375 *this = der;
376 return *this;
377 }
380 while (it_izq.has_curr() and it_der.has_curr())
381 {
382 const size_t & izq = it_izq.get_curr().pot;
383 const size_t & der = it_der.get_curr().pot;
384 if (izq < der)
385 { // insertar a la izquierda del actual de it_izq
386 it_izq.append(Termino(it_der.get_curr().coef, der));
387 it_der.next(); // ver próximo término de polinomio derecho
388 continue;
389 }
390 if (izq == der)
391 { // calcular coeficiente resultado
392 it_izq.get_curr() += it_der.get_curr(); // += Termino
393 it_der.next(); // avanzar a sig término polinomio derecho
394 if (it_izq.get_curr().coef == 0) // ¿suma anula término?
395 { // sí, borrarlo de polinomio izquierdo (coeficiente 0)
396 it_izq.del();
397 continue;
398 }
399 }
400 it_izq.next();
401 }
402 while (it_der.has_curr())
403 { // copia términos restantes derecho a izquierdo
404 terminos.append(Termino(it_der.get_curr().coef,
405 it_der.get_curr().pot));
406 it_der.next();
407 }
408 return *this;
409}
411{
412 Polinomio result;
413 if (terminos.is_empty() or der.terminos.is_empty())
414 return result;
415
417 it_izq(const_cast<DynDlist<Termino>&>(terminos));
418 it_izq.has_curr(); it_izq.next())
419 result += der.multiplicado_por(it_izq.get_curr());
420
421 return result;
422}
423int main()
424{
425 Polinomio p1, p2;
426 int i;
427
428 for (i = 0; i < 20; i++)
429 if (i%2)
430 {
431 Polinomio p(1, i);
432 p1 += p;
433 }
434
435 for (i = 0; i < 40; i++)
436 {
437 Polinomio p(1, i);
438 p2 += p;
439 }
440
441 Polinomio p3(p1*p2);
442
443 printf("\np1 =\n\t"); p1.print();
444 printf("\np2 =\n\t"); p2.print();
445 p1 += p2;
446 printf("\np1 += p2:\n\t"); p1.print();
447 printf("\np1*p2 =\n\t"); p3.print();
448}
Iterator dynamic list.
Dynamic doubly linked list with O(1) size and bidirectional access.
T & append(const T &item)
Append a new item by copy.
Definition htlist.H:1562
constexpr bool is_empty() const noexcept
Return true if list is empty.
Definition htlist.H:523
Polinomio(const Polinomio::Termino &termino)
Definition polinom.C:301
size_t get_power(const size_t &i) const
Polinomio operator/(const Polinomio &) const
const size_t & get_degree() const
Polinomio operator*(const Polinomio &) const
Definition polinom.C:410
const int & get_coef(const size_t &i) const
Polinomio multiplicado_por(const Termino &term) const
Definition polinom.C:305
const size_t & size() const
void print() const
Definition polinom.C:334
Polinomio operator+(const Polinomio &) const
Definition polinom.C:362
Polinomio & operator+=(const Polinomio &)
Definition polinom.C:368
Polinomio operator-(const Polinomio &) const
DynDlist< Termino > terminos
Definition polinom.C:300
Polinomio()
Definition polinom.C:361
Polinomio operator%(const Polinomio &) const
__gmp_expr< T, __gmp_unary_expr< __gmp_expr< T, U >, __gmp_abs_function > > abs(const __gmp_expr< T, U > &expr)
Definition gmpfrxx.h:4051
DynList< T > maps(const C &c, Op op)
Classic map operation.
int main()
Definition polinom.C:423
Termino operator*(const Termino &der) const
Definition polinom.C:295
Termino & operator+=(const Termino &der)
Definition polinom.C:284
Termino(const int &c, const size_t &p)
Definition polinom.C:283
Dynamic doubly linked list implementation.