-
Notifications
You must be signed in to change notification settings - Fork 0
/
Signatures.m
115 lines (96 loc) · 2.61 KB
/
Signatures.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
// Created: Tue May 8 16:03:43 2018
// Last modified: Mon Jan 28 16:10:50 2019
// Hash: 57e6905efd2ee6e5ea220436b511d723
Sig := recformat<k,mu,i>;
function Sig_Create(coef,mon,i)
/* Create a signature coef * mon * e_i */
aa := rec<Sig|>;
aa`k := coef;
aa`mu := mon;
aa`i := i;
return aa;
end function;
Sig_Null := Sig_Create(1,1,0);
function Sig_IsNull(s)
return s`i eq 0 or s`k eq 0;
end function;
function Sig_Simeq(s1,s2)
/* True iff s1 \simeq s2 (equality of the module monomial parts)
*/
return (Sig_IsNull(s1) and Sig_IsNull(s2)) or (s1`mu eq s2`mu and s1`i eq s2`i);
end function;
function Sig_Eq(s1,s2)
/* True iff s1 = s2 */
return Sig_Simeq(s1,s2) and s1`k eq s2`k;
end function;
function Sig_Lt(s1,s2)
/* True iff s1 \prec s2 */
return Sig_IsNull(s1) or s1`i lt s2`i or (s1`i eq s2`i and s1`mu lt s2`mu);
end function;
function Sig_Leq(s1,s2)
/* True iff s1 \prec s2 or s1 \simeq s2 */
return Sig_Lt(s1,s2) or Sig_Simeq(s1,s2);
end function;
function Sig_Geq(s1,s2)
/* True iff s1 \succ s2 or s1 \simeq s2 */
return not Sig_Lt(s1,s2);
end function;
function Sig_Gt(s1,s2)
/* True iff s1 \succ s2 */
return not Sig_Leq(s1,s2);
end function;
function Sig_Multiply(aa,coef,mon)
/* Multiply the signature aa with coef*mon */
return Sig_Create(aa`k*coef,aa`mu*mon,aa`i);
end function;
function Sig_Max(aa,bb)
/* Return the max of two signature */
if Sig_Lt(aa,bb) then
return bb;
else
return aa;
end if;
end function;
function Sig_Add(aa,bb)
/* Adds two signatures. Returns Sig_Null in case of signature drop */
if Sig_Simeq(aa,bb) then
return Sig_Null;
k := aa`k + bb`k;
if k eq 0 then
return Sig_Null;
else
return Sig_Create(k,aa`mu,aa`i);
end if;
else
return Sig_Max(aa,bb);
end if;
end function;
function Sig_Compare(s1,s2)
/* Comparison function, suitable for Sort */
if Sig_Lt(s1,s2) then
return -1;
elif Sig_Simeq(s1,s2) then
return 0;
else
return 1;
end if;
end function;
function Sig_Compare_Full(s1,s2)
/* Comparison function taking into account the coefficient,
suitable for Sort */
if Sig_Lt(s1,s2) then
return -1;
elif Sig_Simeq(s1,s2) then
if Abs(s1`k) lt Abs(s2`k) then
return -1;
else
return 1;
end if;
else
return 1;
end if;
end function;
function Sig_ToString(s)
/* Convert a signature to a printable string */
return Sprintf("%o*%o*e_%o",s`k,s`mu,s`i);
end function;