[CoCoA logo]
Home Page
CoCoA System
Computations in Commutative Algebra

¿Qué es CoCoA?


This pages counts visits by visitors



¿Qué podemos calcular con CoCoA?

  • Enteros muy grandes
  • Números Racionales
  • Polinomios
  • Sistemas de equaciones lineales
  •  
  • Soluciones entereas no negativas
  • Un ejemplo de lógica
  • Coloreando un mapa geográfico
  • Fórmula de Herón

  • Enteros muy grandes

    El mayor "entero de máquina" que es posible calcular en un ordenador de 32 bits es 2^32-1. Pero CoCoA, gracias a la utilización de la potente librería GMP, puede calcular números mayores, como 2^300000: ¡pruébalo!
    2^32-1; 
    4294967295
    2^64-1; 
    18446744073709551615

    Números Racionales

    CoCoA es muy preciso con las fracciones: ¡nunca las aproxima! Así 1/3 es realmente distinto de 0.3333333333333.
    (1/3) * 3;
    1
    0.3333333333333 * 3;
    9999999999999/10000000000000

    Polinomios

    CoCoA está especializado en cálculos con polinomios: puede multiplicar, dividir, factorizar, ...
    (x-y)^2 * (x^4-4*z^4) / (x^2+2*z^2);
    x^4 -2*x^3*y +x^2*y^2 -2*x^2*z^2 +4*x*y*z^2 -2*y^2*z^2
    Factor(x^4 -2*x^3*y +x^2*y^2 -2*x^2*z^2 +4*x*y*z^2 -2*y^2*z^2);
    record[
      RemainingFactor := 1,
      factors := [x^2 -2*z^2,  x -y],
      multiplicities := [1,  2]]
    ]

    Sistemas de equaciones lineales

    CoCoA puede resolver sistemas lineales. Sólo hay que escribir cada ecuación f = c como el polinomio f - c. Además CoCoA también puede resolver sistemas de polinomios, aunque ésto es un poco más difícil y lo veremos más adelante. Ahora resolvemos:
    x-y+z=2
    3x-z=-6
    x+y=1
    System := ideal(x-y+z-2, 3*x-z+6, x+y-1);
    ReducedGBasis(System);
    [x +3/5,  y -8/5,  z -21/5]
    Así la solución es (z=21/5, x=-3/5, y=8/5)

    Soluciones entereas no negativas

    ¿Es posible encontrar tríadas de soluciones enteras no negativas del siguiente sistema?
    3x - 4y + 7z=2
    2x - 2y + 5z=10
    M := mat([[3, -4, 7, -2], [2, -2, 5, -10]]);
    H := HilbertBasisKer(M);
    L := [h In H | h[4] <= 1];
    L;
    [[0, 10, 6, 1], [6, 11, 4, 1], [12, 12, 2, 1], [18, 13, 0, 1]]
    Ésto significa que existen exactamente cuatro soluciones: (0, 10, 6), (6, 11, 4), (12, 12, 2), (18, 13, 0).

    Un ejemplo de lógica

    A dice: "B miente."
    B dice: "C miente."
    C dice: "A y B mienten."
    Entonces, ¿quién está mintiendo?
    Para responder a esta pregunta codificamos VERDADERO como 1 y FALSO como 0 en ZZ/(2):
    use ZZ/(2)[a,b,c];
    I1 := ideal(a, b-1);
    I2 := ideal(a-1, b);
    A := intersect(I1, I2);
    I3 := ideal(b, c-1);
    I4 := ideal(b-1, c);
    B := intersect(I3, I4);
    I5 := ideal(a, b, c-1);
    I6 := ideal(b-1, a, c);
    I7 := ideal(b, a-1, c);
    I8 := ideal(b-1, a-1, c);
    C := IntersectList([I5, I6, I7, I8]);
    ReducedGBasis(A + B + C);
    [b +1,  a,  c]
    La única posibilidad es que A y C mienten, y que B dice la verdad.

    Coloreando un mapa geográfico

    ¿Es posible pintar los países en un mapa con sólo tres colores de modo que si dos países comparten frontera no estén pintados del mismo color?

    use P ::= ZZ/(3)[x[1..6]];
    define F(X)  return X*(X-1)*(X+1);  enddefine;
    VerticesEq := [ F(x[i]) | i in 1..6 ];
    edges := [[1,2],[1,3],  [2,3],[2,4],[2,5],  [3,4],[3,6],
              [4,5],[4,6],  [5,6]];
    EdgesEq := [ (F(x[edge[1]])-F(x[edge[2]]))/(x[edge[1]]-x[edge[2]])
                      |  edge in edges ];
    I := ideal(VerticesEq) + ideal(EdgesEq) + ideal(x[1]-1, x[2]);
    ReducedGBasis(I);
    [x[2],  x[1] -1,  x[3] +1,  x[4] -1,  x[6],  x[5] +1]
    El resultado puede interpretarse como sigue: las variables x[1],...,x[6] representan a los países y los enteros -1, 0 y 1 a los colores. CoCoA encuentra una coloración posible: el color 0 para el país 2, el 1 para el país 1, ... y el color -1 para el país 5.


    Fórmula de Herón

    ¿Es posible expresar el área de un triángulo en función de las longitudes de sus lados?

    use QQ[x[1..2],y,a,b,c,s];
    A := [x[1], 0];
    B := [x[2], 0];
    C := [ 0,   y];
    Hp := ideal(a^2 - (x[2]^2+y^2),  b^2 - (x[1]^2+y^2),
                c   - (x[2]-x[1]),   2*s - c*y);
    E := elim(x[1]..y, Hp);
    f := monic(gens(E)[1]);
    f;
    a^4 -2*a^2*b^2 +b^4 -2*a^2*c^2 -2*b^2*c^2 +c^4 +16*s^2
    factor(f - 16*s^2);
    record[
      RemainingFactor := 1,
      factors := [a +b -c,  a -b +c,  a +b +c,  a -b -c],
      multiplicities := [1,  1,  1,  1]
    ]
    Obenemos la fórmula
    s^2 = -(1/16)(a+b+c)(a+b-c)(a-b+c)(a-b-c).
    Ésto significa que el cuadrado del área de un triángulo de lados a,b,c es p(p-a)(p-b)(p-c), donde p = 1/2(a+b+c) representa el semiperímetro del triángulo. ¡Ésta es la fórmula de Herón! Así pues, la respuesta es: ¡Sí!

    Written by Montserrat Manubens
    Please send comments or suggestions to cocoa(at)dima.unige.it
    Last Update: 20 November 2018