===================================================================
RCS file: /home/cvs/OpenXM_contrib2/asir2000/lib/sp,v
retrieving revision 1.4
retrieving revision 1.14
diff -u -p -r1.4 -r1.14
--- OpenXM_contrib2/asir2000/lib/sp	2000/03/17 01:33:49	1.4
+++ OpenXM_contrib2/asir2000/lib/sp	2005/08/18 23:35:20	1.14
@@ -1,10 +1,59 @@
-/* $OpenXM: OpenXM_contrib2/asir2000/lib/sp,v 1.3 2000/03/10 09:22:39 noro Exp $ */
+/*
+ * Copyright (c) 1994-2000 FUJITSU LABORATORIES LIMITED 
+ * All rights reserved.
+ * 
+ * FUJITSU LABORATORIES LIMITED ("FLL") hereby grants you a limited,
+ * non-exclusive and royalty-free license to use, copy, modify and
+ * redistribute, solely for non-commercial and non-profit purposes, the
+ * computer program, "Risa/Asir" ("SOFTWARE"), subject to the terms and
+ * conditions of this Agreement. For the avoidance of doubt, you acquire
+ * only a limited right to use the SOFTWARE hereunder, and FLL or any
+ * third party developer retains all rights, including but not limited to
+ * copyrights, in and to the SOFTWARE.
+ * 
+ * (1) FLL does not grant you a license in any way for commercial
+ * purposes. You may use the SOFTWARE only for non-commercial and
+ * non-profit purposes only, such as academic, research and internal
+ * business use.
+ * (2) The SOFTWARE is protected by the Copyright Law of Japan and
+ * international copyright treaties. If you make copies of the SOFTWARE,
+ * with or without modification, as permitted hereunder, you shall affix
+ * to all such copies of the SOFTWARE the above copyright notice.
+ * (3) An explicit reference to this SOFTWARE and its copyright owner
+ * shall be made on your publication or presentation in any form of the
+ * results obtained by use of the SOFTWARE.
+ * (4) In the event that you modify the SOFTWARE, you shall notify FLL by
+ * e-mail at risa-admin@sec.flab.fujitsu.co.jp of the detailed specification
+ * for such modification or the source code of the modified part of the
+ * SOFTWARE.
+ * 
+ * THE SOFTWARE IS PROVIDED AS IS WITHOUT ANY WARRANTY OF ANY KIND. FLL
+ * MAKES ABSOLUTELY NO WARRANTIES, EXPRESSED, IMPLIED OR STATUTORY, AND
+ * EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT OF THIRD PARTIES'
+ * RIGHTS. NO FLL DEALER, AGENT, EMPLOYEES IS AUTHORIZED TO MAKE ANY
+ * MODIFICATIONS, EXTENSIONS, OR ADDITIONS TO THIS WARRANTY.
+ * UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, TORT, CONTRACT,
+ * OR OTHERWISE, SHALL FLL BE LIABLE TO YOU OR ANY OTHER PERSON FOR ANY
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, PUNITIVE OR CONSEQUENTIAL
+ * DAMAGES OF ANY CHARACTER, INCLUDING, WITHOUT LIMITATION, DAMAGES
+ * ARISING OUT OF OR RELATING TO THE SOFTWARE OR THIS AGREEMENT, DAMAGES
+ * FOR LOSS OF GOODWILL, WORK STOPPAGE, OR LOSS OF DATA, OR FOR ANY
+ * DAMAGES, EVEN IF FLL SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF
+ * SUCH DAMAGES, OR FOR ANY CLAIM BY ANY OTHER PARTY. EVEN IF A PART
+ * OF THE SOFTWARE HAS BEEN DEVELOPED BY A THIRD PARTY, THE THIRD PARTY
+ * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE,
+ * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE.
+ *
+ * $OpenXM: OpenXM_contrib2/asir2000/lib/sp,v 1.13 2004/04/13 07:43:20 noro Exp $ 
+*/
 /* 
 	sp : functions related to algebraic number fields
 
 	Revision History:
 
-	2000/03/10    noro    fixed several bugs
+	2001/10/12    noro    if USE_PARI_FACTOR is nonzero, pari factor is called
+	2000/03/10    noro    fixed several bugs around gathering algebraic numbers
 	1999/08/24    noro    modified for 1999 release version
 */
 
@@ -12,7 +61,22 @@
 
 extern ASCENT,GCDTIME,UFTIME,RESTIME,SQTIME,PRINT$
 extern Ord$
+extern USE_PARI_FACTOR$
 
+/* gen_sp can handle non-monic poly */
+
+def gen_sp(P)
+{
+	P = ptozp(P);
+	V = var(P);
+	D = deg(P,V);
+	LC = coef(P,D,V);
+	F = LC^(D-1)*subst(P,V,V/LC);
+	/* F must be monic */
+	L = sp(F);
+	return cons(map(subst,car(L),V,LC*V),cdr(L));
+}
+
 def sp(P)
 {
 	RESTIME=UFTIME=GCDTIME=SQTIME=0;
@@ -544,6 +608,21 @@ def simpcoef(P) {
 }
 
 def ufctrhint_heuristic(P,HINT,PP,SHIFT) {
+	if ( USE_PARI_FACTOR )
+		return pari_ufctr(P);
+	else
+		return asir_ufctrhint_heuristic(P,HINT,PP,SHIFT);
+}
+
+def pari_ufctr(P) {
+	F = pari(factor,P);
+	S = size(F);
+	for ( I = S[0]-1, R = []; I >= 0; I-- )
+		R = cons(vtol(F[I]),R);
+	return cons([1,1],R);
+}
+
+def asir_ufctrhint_heuristic(P,HINT,PP,SHIFT) {
 	V = var(P); D = deg(P,V);
 	if ( D == HINT )
 		return [[P,1]];
@@ -724,8 +803,13 @@ def norm_ch_lag(V,VM,P,P0) {
 
 def cr_gcda(P1,P2)
 {
-	if ( !(V = var(P1)) || !var(P2) )
+	if ( !P1 )
+		return P2;
+	if ( !P2 )
+		return P1;
+	if ( !var(P1) || !var(P2) )
 		return 1;
+	V = var(P1);
 	EXT = union_sort(getalgtreep(P1),getalgtreep(P2));
 	if ( EXT == [] )
 		return gcd(P1,P2);
@@ -1262,8 +1346,12 @@ def resfctr(F,L,V,N)
 	N = ptozp(N);
 	V0 = var(N);
 	DN = diff(N,V0);
+	LC = coef(N,deg(N,V0),V0);
+	LCD = coef(DN,deg(DN,V0),V0);
 	for ( I = 0, J = 2, Len = deg(N,V0)+1; I < 5; J++ ) {
 		M = prime(J);
+		if ( !(LC%M) || !(LCD%M))
+			continue;
 		G = gcd(N,DN,M);
 		if ( !deg(G,V0) ) {            
 			I++;
@@ -1287,7 +1375,7 @@ def resfctr_mod(F,L,M)
 		C = res(var(MP),B,MP) % M;
 		R = cons(flatten(cdr(modfctr(C,M))),R);
 	}
-	return R;
+	return reverse(R);
 }
 
 def flatten(L)