Home Page
|
CoCoA System
Computations in
Commutative
Algebra
Wat is CoCoA?
|
|
This pages counts
visits
by
visitors
- CoCoA is een programma, dat met getallen en veeltermen kan
rekenen.
- U hoeft er niet voor te betalen.
- Het wordt voor vele bedrijfssystemen.
- Het wordt gebruikt door vele onderzoekers, maar het kan ook
"eenvoudige" berekeningen uitvoeren.
Wat kunt U met CoCoA berekenen?
Hele grote gehele getallen
Het grootste gehele "Computer-Getal" op een
32-Bit-Computer is 2^32-1. Maar CoCoA kan - dank zij de machtige
GMP-bibliotheek - zelfs getallen zoals 2^300000 berekenen: probeer het!
2^32-1;
4294967295
2^64-1;
18446744073709551615
Rationale getallen
CoCoA rekent heel precies met breuken - het gebruikt nooit
benaderingen! Dus 1/3 verschilt volledig van 0.3333333333333
(1/3) * 3;
1
0.3333333333333 * 3;
9999999999999/10000000000000
Veeltermen
CoCoA is gespecialiseerd in berekeningen met
veeltermen:
Het kan vermenigvuldigen, delen en ontbinden, ...
(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]]
]
Stelsels van lineaire vergelijkingen
CoCoA kan stelsels van lineaire vergelijkingen
oplossen. Daavoor moet U een vergelijking
f = c
omzetten in een veelterm
f -c
. CoCoA kan ook stelsels
van vergelijkingen met veeltermen van hogere graad oplossen. Maar dat
is ingewikkelder en we gaan dat later bekijken. Nu zullen we het
volgende stelsel van lineaire vergelijkingen oplossen:
System := ideal(x-y+z-2, 3*x-z+6, x+y-1);
ReducedGBasis(System);
[x +3/5, y -8/5, z -21/5]
Dus de oplossing is (z=21/5, x=-3/5,
y=8/5)
Niet-negatieve gehele oplossingen
Kunt U de drietallen van niet-negatieve gehele oplossingen
vinden van het volgende systeem?
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]]
De interpretatie is dat er precies vier
oplossingen zijn:
(0, 10, 6), (6, 11, 4), (12, 12, 2), (18, 13, 0).
Een voorbeeld uit de logica
A zegt: "B liegt."
B zegt: "C liegt."
C zegt: "A en B liegen."
Nu is de vraag: wie liegt hier?
Om deze vraag te beantwoorden coderen we WAAR met 1 en ONWAAR met 0 in
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]
De enige oplossing is dat A en C logen en dat B de
waarheid sprak.
Kleuren van landkaarten
Kunnen de landen van de kaart gekleurd worden met drie
kleuren zodanig dat geen twee aanliggende landen dezelfde kleur hebben?
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]
De interpretatie is dat er inderdaad een kleuring
is. In dit geval bijvoorbeeld als 0 staat voor blauw, 1 staat voor rood en -1
staat voor groen, dan krijgen we [land 1 = rood; land 2 = blauw;
land 3 = groen; land 4 = rood; land 5 = groen; land 6 = blauw]
De Formule van Heron
Kan men de oppervlakte van een driehoek uitdrukken als
functie van de lengte van de zijden?
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]
]
De interpretatie is dat we hebben
s^2 = -(1/16)(a+b+c)(a+b-c)(a-b+c)(a-b-c).
Dit betekent dat het kwadraat van de oppervlakte van een driehoek met
zijden a,b,c gelijk is aan
p(p-a)(p-b)(p-c) waarbij p = 1/2(a+b+c) is de halve omtrek van de driehoek.
Dus het antwoord is JA.
Written by Stef Tijs
Please send comments or suggestions to cocoa(at)dima.unige.it
Last Update: 20 November 2018