1 #line 2 "../src/kernel/none/cmp.c"
2 /* Copyright (C) 2002-2003  The PARI group.
3 
4 This file is part of the PARI/GP package.
5 
6 PARI/GP is free software; you can redistribute it and/or modify it under the
7 terms of the GNU General Public License as published by the Free Software
8 Foundation; either version 2 of the License, or (at your option) any later
9 version. It is distributed in the hope that it will be useful, but WITHOUT
10 ANY WARRANTY WHATSOEVER.
11 
12 Check the License for details. You should have received a copy of it, along
13 with the package; see the file 'COPYING'. If not, write to the Free Software
14 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */
15 
16 
17 /********************************************************************/
18 /**                                                                **/
19 /**                      Comparison routines                       **/
20 /**                                                                **/
21 /********************************************************************/
22 
23 /*They depend on cmpiispec and equaliispec in mp.c*/
24 
25 int
equalii(GEN x,GEN y)26 equalii(GEN x, GEN y)
27 {
28   if ((x[1] & (LGBITS|SIGNBITS)) != (y[1] & (LGBITS|SIGNBITS))) return 0;
29   return equaliispec(x+2, y+2, lgefint(x)-2, lgefint(y)-2);
30 }
31 
32 int
cmpii(GEN x,GEN y)33 cmpii(GEN x, GEN y)
34 {
35   const long sx = signe(x), sy = signe(y);
36   if (sx<sy) return -1;
37   if (sx>sy) return 1;
38   if (!sx) return 0;
39   if (sx>0)
40     return cmpiispec(x+2, y+2, lgefint(x)-2, lgefint(y)-2);
41   else
42     return -cmpiispec(x+2, y+2, lgefint(x)-2, lgefint(y)-2);
43 }
44 
45 int
equalrr(GEN x,GEN y)46 equalrr(GEN x, GEN y)
47 {
48   long lx, ly, i;
49 
50   if (!signe(x)) {
51     if (!signe(y)) return 1; /* all zeroes are equal */
52     return expo(x) >= expo(y);
53   }
54   if (!signe(y))
55     return expo(y) >= expo(x);
56 
57   if (x[1] != y[1]) return 0;
58 
59   lx = lg(x);
60   ly = lg(y);
61   if (lx < ly)
62   {
63     i=2; while (i<lx && x[i]==y[i]) i++;
64     if (i<lx) return 0;
65     for (; i < ly; i++) if (y[i]) return 0;
66   }
67   else
68   {
69     i=2; while (i<ly && x[i]==y[i]) i++;
70     if (i<ly) return 0;
71     for (; i < lx; i++) if (x[i]) return 0;
72   }
73   return 1;
74 }
75 
76 int
cmprr(GEN x,GEN y)77 cmprr(GEN x, GEN y)
78 {
79   const long sx = signe(x), sy = signe(y);
80   long ex,ey,lx,ly,lz,i;
81 
82   if (!sx) {
83     if (!sy || expo(x) >= expo(y)) return 0;
84     return sy > 0? -1: 1;
85   }
86   if (!sy) {
87     if (expo(y) >= expo(x)) return 0;
88     return sx > 0? 1: -1;
89   }
90   if (sx<sy) return -1;
91   if (sx>sy) return 1;
92 
93   ex=expo(x); ey=expo(y);
94   if (ex>ey) return sx;
95   if (ex<ey) return -sx;
96 
97   lx=lg(x); ly=lg(y); lz = (lx<ly)?lx:ly;
98   i=2; while (i<lz && x[i]==y[i]) i++;
99   if (i<lz) return ((ulong)x[i] > (ulong)y[i]) ? sx : -sx;
100   if (lx>=ly)
101   {
102     while (i<lx && !x[i]) i++;
103     return (i==lx) ? 0 : sx;
104   }
105   while (i<ly && !y[i]) i++;
106   return (i==ly) ? 0 : -sx;
107 }
108 
109 /* x and y are integers. Return 1 if |x| == |y|, 0 otherwise */
110 int
absequalii(GEN x,GEN y)111 absequalii(GEN x, GEN y)
112 {
113   if (!signe(x)) return !signe(y);
114   if (!signe(y)) return 0;
115   return equaliispec(x+2, y+2, lgefint(x)-2, lgefint(y)-2);
116 }
117 
118 /* x and y are integers. Return sign(|x| - |y|) */
119 int
abscmpii(GEN x,GEN y)120 abscmpii(GEN x, GEN y)
121 {
122   if (!signe(x)) return signe(y)? -1: 0;
123   if (!signe(y)) return 1;
124   return cmpiispec(x+2, y+2, lgefint(x)-2, lgefint(y)-2);
125 }
126 
127 /* x and y are reals. Return sign(|x| - |y|) */
128 int
abscmprr(GEN x,GEN y)129 abscmprr(GEN x, GEN y)
130 {
131   long ex,ey,lx,ly,lz,i;
132 
133   if (!signe(x)) return signe(y)? -1: 0;
134   if (!signe(y)) return 1;
135 
136   ex=expo(x); ey=expo(y);
137   if (ex>ey) return  1;
138   if (ex<ey) return -1;
139 
140   lx=lg(x); ly=lg(y); lz = (lx<ly)?lx:ly;
141   i=2; while (i<lz && x[i]==y[i]) i++;
142   if (i<lz) return ((ulong)x[i] > (ulong)y[i])? 1: -1;
143   if (lx>=ly)
144   {
145     while (i<lx && !x[i]) i++;
146     return (i==lx)? 0: 1;
147   }
148   while (i<ly && !y[i]) i++;
149   return (i==ly)? 0: -1;
150 }
151 
152