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

Què és CoCoA?


This pages counts visits by visitors



Què podem calcular amb CoCoA?

  • Enters molt grans
  • Nombres Racionals
  • Polinomis
  • Sistemes d'equacions lineals
  •  
  • Solucions enteres no negatives
  • Un exemple de lògica
  • Pintem un mapa geogràfic
  • Fórmula d'Heró

  • Enters molt grans

    L'"enter de màquina" més gran que es pot calcular en un ordinador de 32 bits és 2^32-1. CoCoA, però, gràcies a l'ús de la potent llibreria GMP, pot arribar a calcular nombres com 2^300000: prova-ho!
    2^32-1; 
    4294967295
    2^64-1; 
    18446744073709551615

    Nombres Racionals

    CoCoA és molt precís amb les fraccions: mai les aproxima! Així doncs, 1/3 és realment diferent de 0.3333333333333.
    (1/3) * 3;
    1
    0.3333333333333 * 3;
    9999999999999/10000000000000

    Polinomis

    CoCoA està especialitzat per a càlculs amb polinomis: pot multiplicar, dividir, factoritzar, ...
    (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]]
    ]

    Sistemes d'equacions lineals

    CoCoA pot resoldre sitemes lineals. Només cal escriure cada equació f = c com el polinomi f - c. A més, CoCoA també pot resoldre sistemes polinomials, tot i que és una mica més difícil i ho veurem més endavant. Ara resolem:
    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]
    Per tant, la solució és (z=21/5, x=-3/5, y=8/5)

    Solucions enteres no negatives

    És possible trobar tríades de solucions enteres no negatives del sistema següent?
    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]]
    Hi ha, doncs, exactament quatre solucions: (0, 10, 6), (6, 11, 4), (12, 12, 2), (18, 13, 0).

    Un exemple de lògica

    A diu: "B menteix."
    B diu: "C menteix."
    C diu: "A i B menteixen."
    Qui menteix doncs?
    Per a respondre a aquesta pregunta codifiquem VERITABLE com 1 i FALS com 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]
    L'única solució és que A i C menteixen, i que B diu la veritat.

    Pintem un mapa geogràfic

    És possible pintar els països d'un mapa amb només tres colors de tal manera que si dos països comparteixen frontera no puguin ser del mateix 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 resultat s'interpreta com segueix: les variables x[1],...,x[6] representen els països i els enters -1, 0 i 1 representen els colors. CoCoA dóna una coloració possible: el color 0 per al païs 2, el color 1 per al païs 1, ... i el color -1 per al païs 5.


    Fórmula d'Heró

    És possible expressar l'àrea d'un triangle en funció de les longituds dels seus costats?

    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]
    ]
    Obtenim la fórmula
    s^2 = -(1/16)(a+b+c)(a+b-c)(a-b+c)(a-b-c).
    Això significa que el quadrat de l'àrea d'un triangle amb costats a,b i c és precisament p(p-a)(p-b)(p-c), on p = 1/2(a+b+c) representa el semiperímetre del triangle. Aquesta és la fórmula d'Heró! Així doncs, la resposta és: SI!
    s^2 = -(1/16)(a+b+c)(a+b-c)(a-b+c)(a-b-c).

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