Changeset 2391e4 in git
- Timestamp:
- May 3, 2013, 8:56:15 PM (10 years ago)
- Branches:
- (u'jengelh-datetime', 'ceac47cbc86fe4a15902392bdbb9bd2ae0ea02c6')(u'spielwiese', 'a800fe4b3e9d37a38c5a10cc0ae9dfa0c15a4ee6')
- Children:
- a8f51f2cbfd5e70ab9d6ada456b3c4f409b753bd
- Parents:
- 552d26572655f537d219086f12ab104e239f7db2ed95e6148ac6926aac6e83629cf4545c5c95a7a7
- Files:
-
- 7 added
- 18 edited
Legend:
- Unmodified
- Added
- Removed
-
Singular/LIB/absfact.lib
r552d26 r2391e4 26 26 PROCEDURES: 27 27 absFactorize(); absolute factorization of poly 28 absBiFactorize(); absolute factorization of bivariate poly 28 29 "; 29 30 … … 609 610 } 610 611 612 //////////////////////////////////////////////////////////////////////////////// 613 proc absBiFactorize(poly p, list #) 614 "USAGE: absBiFactorize(p [,s]); p poly, s string 615 ASSUME: coefficient field is the field of rational numbers or a 616 transcendental extension thereof 617 RETURN: ring @code{R} which is obtained from the current basering 618 by adding a new parameter (if a string @code{s} is given as a 619 second input, the new parameter gets this string as name). The ring 620 @code{R} comes with a list @code{absolute_factors} with the 621 following entries: 622 @format 623 absolute_factors[1]: ideal (the absolute factors) 624 absolute_factors[2]: intvec (the multiplicities) 625 absolute_factors[3]: ideal (the minimal polynomials) 626 absolute_factors[4]: int (total number of nontriv. absolute factors) 627 @end format 628 The entry @code{absolute_factors[1][1]} is a constant, the 629 entry @code{absolute_factors[3][1]} is the parameter added to the 630 current ring.@* 631 Each of the remaining entries @code{absolute_factors[1][j]} stands for 632 a class of conjugated absolute factors. The corresponding entry 633 @code{absolute_factors[3][j]} is the minimal polynomial of the 634 field extension over which the factor is minimally defined (its degree 635 is the number of conjugates in the class). If the entry 636 @code{absolute_factors[3][j]} coincides with @code{absolute_factors[3][1]}, 637 no field extension was necessary for the @code{j}th (class of) 638 absolute factor(s). 639 NOTE: The input polynomial p is assumed to be bivariate or to contain one para- 640 meter and one variable. All factors are presented denominator- and 641 content-free. The constant factor (first entry) is chosen such that the 642 product of all (!) the (denominator- and content-free) absolute factors 643 of @code{p} equals @code{p / absolute_factors[1][1]}. 644 SEE ALSO: factorize, absPrimdecGTZ, absFactorize 645 EXAMPLE: example absBiFactorize; shows an example 646 " 647 { 648 int dblevel = printlevel - voice + 2; 649 dbprint(dblevel,"Entering absfact.lib::absBiFactorize with ",p); 650 def MP = basering; 651 int i; 652 if (char(MP) != 0) 653 { 654 ERROR("// absfact.lib::absBiFactorize is only implemented for "+ 655 "characteristic 0"); 656 } 657 if(minpoly!=0) 658 { 659 ERROR("// absfact.lib::absBiFactorize is not implemented for algebraic " 660 +"extensions"); 661 } 662 663 int n = nvars(MP); 664 int pa=npars(MP); 665 list lMP= ringlist(MP); 666 intvec vv,vk; 667 for(i=1;i<=n;i++){vv[i]=1;} 668 vk=vv,1; 669 670 //if the basering has parameters, add the parameters to the variables 671 //takes care about coefficients and possible denominators 672 if(pa>0) 673 { 674 poly qh=cleardenom(p); 675 if (p==0) 676 { 677 number cok=0; 678 } 679 else 680 { 681 number cok=leadcoef(p)/leadcoef(qh); 682 } 683 p=qh; 684 string sp; 685 for(i=1;i<=npars(basering);i++) 686 { 687 sp=string(par(i)); 688 sp=sp[2..size(sp)-1]; 689 lMP[2][n+i]=sp; 690 vv=vv,1; 691 } 692 lMP[1]=0; 693 n=n+npars(MP); 694 } 695 696 // MPz is obtained by adding the new variable @z to MP 697 // ordering is wp(1...1) 698 // All the above subroutines work in MPz 699 string newvar; 700 if(size(#)>0) 701 { 702 if(typeof(#[1])=="string") 703 { 704 newvar=#[1]; 705 } 706 else 707 { 708 newvar = "a"; 709 } 710 } 711 else 712 { 713 newvar = "a"; 714 } 715 if (newvar=="a") 716 { 717 if(belongTo(newvar, lMP[2])||defined(a)){newvar = "b";} 718 if(belongTo(newvar, lMP[2])||defined(b)){newvar = "c";} 719 if(belongTo(newvar, lMP[2])||defined(c)){newvar = "@c";} 720 while(belongTo(newvar, lMP[2])) 721 { 722 newvar = "@" + newvar; 723 } 724 } 725 726 // create ring with extra parameter `newvar` for output: 727 setring(MP); 728 list Lout=ringlist(MP); 729 if(!pa) 730 { 731 list Lpar=list(char(MP),list(newvar),list(list("lp",intvec(1))),ideal(0)); 732 } 733 else 734 { 735 list Lpar=Lout[1]; 736 Lpar[2][size(Lpar[2])+1]=newvar; 737 vv=Lpar[3][1][2]; 738 vv=vv,1; 739 Lpar[3][1][2]=vv; 740 } 741 Lout[1]=Lpar; 742 def MPo=ring(Lout); 743 setring(MPo); 744 745 poly p=imap(MP,p); 746 747 if (size (variables (p)) > 2) 748 { 749 ERROR("// absfact.lib::absBiFactorize is not implemented for polynomials " 750 +"with more than 2 variables"); 751 } 752 753 // special treatment in the homogeneous case, dropping one variable 754 // by substituting the first variable by 1 755 int ho=homog(p); 756 if(ho) 757 { 758 int dh=deg(p); 759 p=subst(p,var(1),1); 760 int di=deg(p); 761 } 762 763 list tmpf=system ("absBiFact", p); 764 765 // the homogeneous case, homogenizing the result 766 // the new variable has to have degree 0 767 // need to change the ring 768 if(ho) 769 { 770 list ll=ringlist(MPo); 771 vv[size(vv)]=0; 772 ll[3][1][2]=vv; 773 def MPhelp=ring(ll); 774 setring(MPhelp); 775 list tmpf=imap(MPo,tmpf); 776 for(i=2;i<=size(tmpf[1]);i++) 777 { 778 tmpf[1][i]=homog(tmpf[1][i],var(1)); 779 } 780 if(dh>di) 781 { 782 tmpf[1][size(tmpf[1])+1]=var(1); 783 tmpf[2][size(tmpf[2])+1]=dh-di; 784 tmpf[3][size(tmpf[3])+1]=par(npars(MPo)); 785 tmpf[4]= tmpf[4]+dh-di; 786 } 787 setring(MPo); 788 tmpf=imap(MPhelp,tmpf); 789 } 790 791 if (pa) 792 { 793 number cok=imap(MP,cok); 794 tmpf[1][1]=cok*tmpf[1][1]; 795 } 796 797 // if we want the output as string 798 if(size(#)>0) 799 { 800 if(typeof(#[1])=="int") 801 { 802 if(#[1]==77) 803 { // undocumented feature for Gerhard's absPrimdecGTZ 804 if (size(tmpf[1])<2){ list abs_fac = list(var(n+1),poly(1)); } 805 else 806 { 807 list abs_fac= tmpf[3][2]; 808 abs_fac= abs_fac, tmpf[1][2]; 809 for (i= 3; i <= size(tmpf[1]); i++) 810 { 811 abs_fac=abs_fac,tmpf[3][i]; 812 abs_fac=abs_fac,tmpf[1][i]; 813 } 814 } 815 abs_fac=abs_fac,newvar; 816 return(string(abs_fac)); 817 } 818 } 819 } 820 821 list absolute_factors= tmpf; 822 export absolute_factors; 823 setring(MP); 824 825 dbprint( printlevel-voice+3," 826 // 'absBiFactorize' created a ring, in which a list absolute_factors (the 827 // absolute factors) is stored. 828 // To access the list of absolute factors, type (if the name S was assigned 829 // to the return value): 830 setring(S); absolute_factors; "); 831 return(MPo); 832 } 833 example 834 { 835 "EXAMPLE:"; echo = 2; 836 ring R = (0), (x,y), lp; 837 poly p = (-7*x^2 + 2*x*y^2 + 6*x + y^4 + 14*y^2 + 47)*(5x2+y2)^3*(x-y)^4; 838 def S = absBiFactorize(p) ; 839 setring(S); 840 absolute_factors; 841 } 842 843 611 844 /* 612 845 ring r=0,(x,t),dp; -
Singular/LIB/primdec.lib
red95e6 r2391e4 3769 3769 I=interred(I+F);option(set,save);return(I); 3770 3770 } 3771 I=simplify(I,1); 3771 3772 3772 3773 for(i=1;i<=n;i++) //consider all polynomials over … … 4444 4445 if(check==0) // H==I => U is a primary decomposition 4445 4446 { 4446 4447 option(set,save); 4447 4448 return(U); 4448 4449 } -
Singular/extra.cc
r552d26 r2391e4 3683 3683 } 3684 3684 else 3685 /*================= absBiFact ======================*/ 3686 if (strcmp(sys_cmd, "absBiFact") == 0) 3687 { 3688 if (h!=NULL) 3689 { 3690 res->rtyp=LIST_CMD; 3691 if (h->Typ()==POLY_CMD) 3692 { 3693 intvec *v=NULL; 3694 ideal mipos= NULL; 3695 int n= 0; 3696 ideal f=singclap_absBiFactorize((poly)(h->Data()), mipos, &v, n, currRing); 3697 if (f==NULL) return TRUE; 3698 ivTest(v); 3699 lists l=(lists)omAllocBin(slists_bin); 3700 l->Init(4); 3701 l->m[0].rtyp=IDEAL_CMD; 3702 l->m[0].data=(void *)f; 3703 l->m[1].rtyp=INTVEC_CMD; 3704 l->m[1].data=(void *)v; 3705 l->m[2].rtyp=IDEAL_CMD; 3706 l->m[2].data=(void*) mipos; 3707 l->m[3].rtyp=INT_CMD; 3708 l->m[3].data=(void*) (long) n; 3709 res->data=(void *)l; 3710 return FALSE; 3711 } 3712 else return TRUE; 3713 } 3714 else return TRUE; 3715 } 3716 else 3685 3717 #endif 3686 3718 /*================= probIrredTest ======================*/ -
Singular/subexpr.cc
red95e6 r2391e4 1066 1066 return ((idhdl)h->data.ustring)->data.ustring; 1067 1067 } 1068 case VECHO: return (void *) si_echo;1069 case VPRINTLEVEL:return (void *) printlevel;1070 case VCOLMAX: return (void *) colmax;1071 case VTIMER: return (void *) getTimer();1072 case VRTIMER: return (void *) getRTimer();1073 case VOICE: return (void *)( myynest+1);1074 case VMAXDEG: return (void *) Kstd1_deg;1075 case VMAXMULT: return (void *) Kstd1_mu;1076 case TRACE: return (void *) traceit;1077 case VSHORTOUT: return (void *)( currRing != NULL ? currRing->ShortOut : 0);1068 case VECHO: return (void *)(long)si_echo; 1069 case VPRINTLEVEL:return (void *)(long)printlevel; 1070 case VCOLMAX: return (void *)(long)colmax; 1071 case VTIMER: return (void *)(long)getTimer(); 1072 case VRTIMER: return (void *)(long)getRTimer(); 1073 case VOICE: return (void *)(long)(myynest+1); 1074 case VMAXDEG: return (void *)(long)Kstd1_deg; 1075 case VMAXMULT: return (void *)(long)Kstd1_mu; 1076 case TRACE: return (void *)(long)traceit; 1077 case VSHORTOUT: return (void *)(long)(currRing != NULL ? currRing->ShortOut : 0); 1078 1078 case VMINPOLY: 1079 1079 if ( (currRing != NULL) && nCoeff_is_algExt(currRing->cf) && !nCoeff_is_GF(currRing->cf)) -
Tst/Short.lst
r552d26 r2391e4 1 Short/absbifact.tst 1 2 Short/alexpoly.tst 2 3 Short/algebralib.tst -
Tst/Short/ok_s.lst
r552d26 r2391e4 1 1 ;; Test which should pass shifted exponents 2 absbifact 2 3 abusalem 3 4 alexpoly -
factory/Makefile.am
r552d26 r2391e4 62 62 DegreePattern.cc \ 63 63 ExtensionInfo.cc \ 64 facAbsFact.cc \ 64 65 facAlgExt.cc \ 65 66 facBivar.cc \ … … 144 145 DegreePattern.h \ 145 146 ExtensionInfo.h \ 147 facAbsFact.h \ 146 148 facAlgExt.h \ 147 149 facBivar.h \ … … 248 250 249 251 templatesrc = templates/ftmpl_array.cc \ 252 templates/ftmpl_afactor.cc \ 250 253 templates/ftmpl_factor.cc \ 251 254 templates/ftmpl_functions.h \ -
factory/canonicalform.h
r552d26 r2391e4 23 23 #include <factory/templates/ftmpl_list.h> 24 24 #include <factory/templates/ftmpl_array.h> 25 #include <factory/templates/ftmpl_afactor.h> 25 26 #include <factory/templates/ftmpl_factor.h> 26 27 #include <factory/templates/ftmpl_matrix.h> … … 360 361 361 362 //{{{ type definitions 363 typedef AFactor<CanonicalForm> CFAFactor; 364 typedef List <CFAFactor> CFAFList; 365 typedef ListIterator<CFAFactor> CFAFListIterator; 362 366 typedef Factor<CanonicalForm> CFFactor; 363 367 typedef List<CFFactor> CFFList; -
factory/cfNewtonPolygon.cc
r552d26 r2391e4 13 13 14 14 #include "config.h" 15 16 #include "cf_assert.h" 17 15 18 #include <stdlib.h> 16 19 … … 18 21 #include "cf_iter.h" 19 22 #include "cf_algorithm.h" 23 #include "cf_primes.h" 24 #include "cf_reval.h" 25 #include "cf_factory.h" 26 #include "gfops.h" 20 27 #include "cfNewtonPolygon.h" 21 28 #include "templates/ftmpl_functions.h" … … 857 864 bool irreducibilityTest (const CanonicalForm& F) 858 865 { 866 ASSERT (getNumVars (F) == 2, "expected bivariate polynomial"); 867 ASSERT (getCharacteristic() == 0, "expected polynomial over integers or rationals"); 868 859 869 int sizeOfNewtonPolygon; 860 870 int ** newtonPolyg= newtonPolygon (F, sizeOfNewtonPolygon); … … 872 882 if (isRat) 873 883 Off (SW_RATIONAL); 874 CanonicalForm tmp= gcd (newtonPolyg[0][0],newtonPolyg[0][1]); 884 CanonicalForm tmp= gcd (newtonPolyg[0][0],newtonPolyg[0][1]); // maybe it's better to use plain intgcd 875 885 tmp= gcd (tmp, newtonPolyg[1][0]); 876 886 tmp= gcd (tmp, newtonPolyg[1][1]); … … 891 901 return false; 892 902 } 903 904 bool absIrredTest (const CanonicalForm& F) 905 { 906 ASSERT (getNumVars (F) == 2, "expected bivariate polynomial"); 907 ASSERT (factorize (F).length() <= 2, " expected irreducible polynomial"); 908 909 int sizeOfNewtonPolygon; 910 int ** newtonPolyg= newtonPolygon (F, sizeOfNewtonPolygon); 911 bool isRat= isOn (SW_RATIONAL); 912 if (isRat) 913 Off (SW_RATIONAL); 914 int p=getCharacteristic(); 915 int d=1; 916 char bufGFName='Z'; 917 bool GF= (CFFactory::gettype()==GaloisFieldDomain); 918 if (GF) 919 { 920 d= getGFDegree(); 921 bufGFName=gf_name; 922 } 923 924 setCharacteristic(0); 925 926 CanonicalForm g= gcd (newtonPolyg[0][0], newtonPolyg[0][1]); //maybe it's better to use plain intgcd 927 928 int i= 1; 929 while (!g.isOne() && i < sizeOfNewtonPolygon) 930 { 931 g= gcd (g, newtonPolyg[i][0]); 932 g= gcd (g, newtonPolyg[i][1]); 933 i++; 934 } 935 936 bool result= g.isOne(); 937 938 if (GF) 939 setCharacteristic (p, d, bufGFName); 940 else 941 setCharacteristic(p); 942 943 if (isRat) 944 On (SW_RATIONAL); 945 946 for (int i= 0; i < sizeOfNewtonPolygon; i++) 947 delete [] newtonPolyg[i]; 948 949 delete [] newtonPolyg; 950 951 return result; 952 } 953 954 bool modularIrredTest (const CanonicalForm& F) 955 { 956 ASSERT (getNumVars (F) == 2, "expected bivariate polynomial"); 957 ASSERT (factorize (F).length() <= 2, " expected irreducible polynomial"); 958 959 bool isRat= isOn (SW_RATIONAL); 960 if (isRat) 961 Off (SW_RATIONAL); 962 963 if (isRat) 964 ASSERT (bCommonDen (F).isOne(), "poly over Z expected"); 965 966 CanonicalForm Fp, N= maxNorm (F); 967 int tdeg= totaldegree (F); 968 969 int i= 0; 970 //TODO: maybe it's better to choose the characteristic as large as possible 971 // as factorization over large finite field will be faster 972 //TODO: handle those cases where our factory primes are not enough 973 //TODO: factorize coefficients corresponding to the vertices of the Newton 974 // polygon and only try the obtained factors 975 if (N < cf_getSmallPrime (cf_getNumSmallPrimes()-1)) 976 { 977 while (i < cf_getNumSmallPrimes() && N > cf_getSmallPrime(i)) 978 { 979 setCharacteristic (cf_getSmallPrime (i)); 980 Fp= F.mapinto(); 981 i++; 982 if (totaldegree (Fp) == tdeg) 983 { 984 if (absIrredTest (Fp)) 985 { 986 CFFList factors= factorize (Fp); 987 if (factors.length() == 2 && factors.getLast().exp() == 1) 988 { 989 if (isRat) 990 On (SW_RATIONAL); 991 setCharacteristic (0); 992 return true; 993 } 994 } 995 } 996 setCharacteristic (0); 997 } 998 } 999 else 1000 { 1001 while (i < cf_getNumPrimes() && N > cf_getPrime (i)) 1002 { 1003 setCharacteristic (cf_getPrime (i)); 1004 Fp= F.mapinto(); 1005 i++; 1006 if (totaldegree (Fp) == tdeg) 1007 { 1008 if (absIrredTest (Fp)) 1009 { 1010 CFFList factors= factorize (Fp); 1011 if (factors.length() == 2 && factors.getLast().exp() == 1) 1012 { 1013 if (isRat) 1014 On (SW_RATIONAL); 1015 setCharacteristic (0); 1016 return true; 1017 } 1018 } 1019 } 1020 setCharacteristic (0); 1021 } 1022 } 1023 1024 if (isRat) 1025 On (SW_RATIONAL); 1026 1027 return false; 1028 } 1029 1030 bool 1031 modularIrredTestWithShift (const CanonicalForm& F) 1032 { 1033 ASSERT (getNumVars (F) == 2, "expected bivariate polynomial"); 1034 ASSERT (factorize (F).length() <= 2, " expected irreducible polynomial"); 1035 1036 bool isRat= isOn (SW_RATIONAL); 1037 if (isRat) 1038 Off (SW_RATIONAL); 1039 1040 if (isRat) 1041 ASSERT (bCommonDen (F).isOne(), "poly over Z expected"); 1042 1043 Variable x= Variable (1); 1044 Variable y= Variable (2); 1045 CanonicalForm Fp; 1046 int tdeg= totaldegree (F); 1047 1048 REvaluation E; 1049 1050 setCharacteristic (2); 1051 Fp= F.mapinto(); 1052 1053 E= REvaluation (1,2, FFRandom()); 1054 1055 E.nextpoint(); 1056 1057 Fp= Fp (x+E[1], x); 1058 Fp= Fp (y+E[2], y); 1059 1060 if (tdeg == totaldegree (Fp)) 1061 { 1062 if (absIrredTest (Fp)) 1063 { 1064 CFFList factors= factorize (Fp); 1065 if (factors.length() == 2 && factors.getLast().exp() == 1) 1066 { 1067 if (isRat) 1068 On (SW_RATIONAL); 1069 setCharacteristic (0); 1070 return true; 1071 } 1072 } 1073 } 1074 1075 E.nextpoint(); 1076 1077 Fp= Fp (x+E[1], x); 1078 Fp= Fp (y+E[2], y); 1079 1080 if (tdeg == totaldegree (Fp)) 1081 { 1082 if (absIrredTest (Fp)) 1083 { 1084 CFFList factors= factorize (Fp); 1085 if (factors.length() == 2 && factors.getLast().exp() == 1) 1086 { 1087 if (isRat) 1088 On (SW_RATIONAL); 1089 setCharacteristic (0); 1090 return true; 1091 } 1092 } 1093 } 1094 1095 int i= 0; 1096 while (cf_getSmallPrime (i) < 102) 1097 { 1098 setCharacteristic (cf_getSmallPrime (i)); 1099 i++; 1100 E= REvaluation (1, 2, FFRandom()); 1101 1102 for (int j= 0; j < 3; j++) 1103 { 1104 Fp= F.mapinto(); 1105 E.nextpoint(); 1106 Fp= Fp (x+E[1], x); 1107 Fp= Fp (y+E[2], y); 1108 1109 if (tdeg == totaldegree (Fp)) 1110 { 1111 if (absIrredTest (Fp)) 1112 { 1113 CFFList factors= factorize (Fp); 1114 if (factors.length() == 2 && factors.getLast().exp() == 1) 1115 { 1116 if (isRat) 1117 On (SW_RATIONAL); 1118 setCharacteristic (0); 1119 return true; 1120 } 1121 } 1122 } 1123 } 1124 } 1125 1126 setCharacteristic (0); 1127 if (isRat) 1128 On (SW_RATIONAL); 1129 1130 return false; 1131 } 1132 1133 -
factory/cfNewtonPolygon.h
r552d26 r2391e4 74 74 ); 75 75 76 /// absolute irreducibility test as described in "Modular Las Vegas Algorithms 77 /// for Polynomial Absolute Factorization" by C. Bertone, G. Cheze, A. Galligo 78 /// 79 /// @return true if F satisfies condition (C) from the above paper and thus 80 /// is absolutely irreducible, false otherwise 81 bool 82 absIrredTest (const CanonicalForm& F ///< [in] a bivariate polynomial 83 ///< irreducible over ground field 84 ); 85 86 /// modular absolute irreducibility test as described in "Modular Las Vegas 87 /// Algorithms for Polynomial Absolute Factorization" by C. Bertone, G. Cheze, 88 /// A. Galligo 89 /// 90 /// @return true if F is absolutely irreducible, false otherwise 91 bool 92 modularIrredTest (const CanonicalForm& F ///< [in] a bivariate polynomial 93 ///< irreducible over Z 94 ); 95 96 /// modular absolute irreducibility test with shift as described in "Modular Las 97 /// Vegas Algorithms for Polynomial Absolute Factorization" by C. Bertone, 98 /// G. Cheze, A. Galligo 99 /// 100 /// @return true if F is absolutely irreducible, false otherwise 101 bool 102 modularIrredTestWithShift (const CanonicalForm& F ///< [in] a bivariate polynomial 103 ///< irreducible over Z 104 ); 105 106 76 107 #ifdef HAVE_NTL 77 108 /// Algorithm 5 as described in Convex-Dense Bivariate Polynomial Factorization -
factory/facBivar.h
r552d26 r2391e4 51 51 CFMap N; 52 52 CanonicalForm F= compress (G, N); 53 CanonicalForm contentX= content (F, 1); 53 CanonicalForm contentX= content (F, 1); //erwarte hier primitiven input: primitiv ÃŒber Z bzw. Z[a] 54 54 CanonicalForm contentY= content (F, 2); 55 55 F /= (contentX*contentY); -
factory/facFqBivarUtil.cc
r552d26 r2391e4 680 680 { 681 681 n= degree (F, 1); 682 int* result= new int [n]; 683 int sizeOfNewtonPolygon; 684 int** newtonPolyg= newtonPolygon (F, sizeOfNewtonPolygon); 685 686 isIrreducible= false; 687 if (sizeOfNewtonPolygon == 3) 688 { 689 bool check1= 690 (newtonPolyg[0][0]==0 || newtonPolyg[1][0]==0 || newtonPolyg[2][0]==0); 691 if (check1) 692 { 693 bool check2= 694 (newtonPolyg[0][1]==0 || newtonPolyg[1][1]==0 || newtonPolyg[2][0]==0); 695 if (check2) 696 { 697 int p=getCharacteristic(); 698 int d=1; 699 char bufGFName='Z'; 700 bool GF= (CFFactory::gettype()==GaloisFieldDomain); 701 if (GF) 702 { 703 d= getGFDegree(); 704 bufGFName=gf_name; 705 } 706 setCharacteristic(0); 707 CanonicalForm tmp= gcd (newtonPolyg[0][0],newtonPolyg[0][1]); // maybe it's better to use plain intgcd 708 tmp= gcd (tmp, newtonPolyg[1][0]); 709 tmp= gcd (tmp, newtonPolyg[1][1]); 710 tmp= gcd (tmp, newtonPolyg[2][0]); 711 tmp= gcd (tmp, newtonPolyg[2][1]); 712 isIrreducible= (tmp==1); 713 if (GF) 714 setCharacteristic (p, d, bufGFName); 715 else 716 setCharacteristic(p); 717 } 718 } 719 } 720 721 int minX, minY, maxX, maxY; 722 minX= newtonPolyg [0] [0]; 723 minY= newtonPolyg [0] [1]; 724 maxX= minX; 725 maxY= minY; 726 for (int i= 1; i < sizeOfNewtonPolygon; i++) 727 { 728 if (minX > newtonPolyg [i] [0]) 729 minX= newtonPolyg [i] [0]; 730 if (maxX < newtonPolyg [i] [0]) 731 maxX= newtonPolyg [i] [0]; 732 if (minY > newtonPolyg [i] [1]) 733 minY= newtonPolyg [i] [1]; 734 if (maxY < newtonPolyg [i] [1]) 735 maxY= newtonPolyg [i] [1]; 736 } 737 738 int k= maxX; 739 for (int i= 0; i < n; i++) 740 { 741 if (i + 1 > maxY || i + 1 < minY) 742 { 743 result [i]= 0; 744 continue; 745 } 746 int* point= new int [2]; 747 point [0]= k; 748 point [1]= i + 1; 749 while (!isInPolygon (newtonPolyg, sizeOfNewtonPolygon, point) && k > 0) 750 { 751 k--; 752 point [0]= k; 753 } 754 result [i]= k; 755 k= maxX; 756 delete [] point; 757 } 758 759 return result; 760 } 761 762 int * 763 computeBoundsWrtDiffMainvar (const CanonicalForm& F, int& n, 764 bool& isIrreducible) 765 { 766 n= degree (F, 2); 682 767 int* result= new int [n]; 683 768 int sizeOfNewtonPolygon; … … 736 821 } 737 822 738 int k= maxX;739 for (int i= 0; i < n; i++)740 {741 if (i + 1 > maxY || i + 1 < minY)742 {743 result [i]= 0;744 continue;745 }746 int* point= new int [2];747 point [0]= k;748 point [1]= i + 1;749 while (!isInPolygon (newtonPolyg, sizeOfNewtonPolygon, point) && k > 0)750 {751 k--;752 point [0]= k;753 }754 result [i]= k;755 k= maxX;756 delete [] point;757 }758 759 return result;760 }761 762 int *763 computeBoundsWrtDiffMainvar (const CanonicalForm& F, int& n,764 bool& isIrreducible)765 {766 n= degree (F, 2);767 int* result= new int [n];768 int sizeOfNewtonPolygon;769 int** newtonPolyg= newtonPolygon (F, sizeOfNewtonPolygon);770 771 isIrreducible= false;772 if (sizeOfNewtonPolygon == 3)773 {774 bool check1=775 (newtonPolyg[0][0]==0 || newtonPolyg[1][0]==0 || newtonPolyg[2][0]==0);776 if (check1)777 {778 bool check2=779 (newtonPolyg[0][1]==0 || newtonPolyg[1][1]==0 || newtonPolyg[2][0]==0);780 if (check2)781 {782 int p=getCharacteristic();783 int d=1;784 char bufGFName='Z';785 bool GF= (CFFactory::gettype()==GaloisFieldDomain);786 if (GF)787 {788 d= getGFDegree();789 bufGFName=gf_name;790 }791 setCharacteristic(0);792 CanonicalForm tmp= gcd (newtonPolyg[0][0],newtonPolyg[0][1]);793 tmp= gcd (tmp, newtonPolyg[1][0]);794 tmp= gcd (tmp, newtonPolyg[1][1]);795 tmp= gcd (tmp, newtonPolyg[2][0]);796 tmp= gcd (tmp, newtonPolyg[2][1]);797 isIrreducible= (tmp==1);798 if (GF)799 setCharacteristic (p, d, bufGFName);800 else801 setCharacteristic(p);802 }803 }804 }805 806 int minX, minY, maxX, maxY;807 minX= newtonPolyg [0] [0];808 minY= newtonPolyg [0] [1];809 maxX= minX;810 maxY= minY;811 for (int i= 1; i < sizeOfNewtonPolygon; i++)812 {813 if (minX > newtonPolyg [i] [0])814 minX= newtonPolyg [i] [0];815 if (maxX < newtonPolyg [i] [0])816 maxX= newtonPolyg [i] [0];817 if (minY > newtonPolyg [i] [1])818 minY= newtonPolyg [i] [1];819 if (maxY < newtonPolyg [i] [1])820 maxY= newtonPolyg [i] [1];821 }822 823 823 int k= maxY; 824 824 for (int i= 0; i < n; i++) -
factory/factory.template
r552d26 r2391e4 38 38 39 39 #include <factory/templates/ftmpl_array.h> 40 #include <factory/templates/ftmpl_afactor.h> 40 41 #include <factory/templates/ftmpl_factor.h> 41 42 #include <factory/templates/ftmpl_list.h> … … 105 106 #include "facIrredTest.h" 106 107 108 /*MAKEHEADER PUBLIC ONLY*/ 109 #include "facAbsFact.h" 110 107 111 #endif /* ! INCL_FACTORY_H */ -
factory/ftmpl_inst.cc
r552d26 r2391e4 23 23 24 24 #include "templates/ftmpl_array.cc" 25 #include "templates/ftmpl_afactor.cc" 25 26 #include "templates/ftmpl_factor.cc" 26 27 #include "templates/ftmpl_list.cc" … … 34 35 template class ListItem<CFFactor>; 35 36 template class ListIterator<CFFactor>; 37 template class AFactor<CanonicalForm>; 38 template class List<CFAFactor>; 39 template class ListItem<CFAFactor>; 40 template class ListIterator<CFAFactor>; 36 41 template class List<CanonicalForm>; 37 42 template class ListItem<CanonicalForm>; … … 77 82 78 83 template int operator == ( const Factor<CanonicalForm> &, const Factor<CanonicalForm> & ); 84 template int operator == ( const AFactor<CanonicalForm> &, const AFactor<CanonicalForm> & ); 79 85 80 86 template List<CFFactor> Union ( const List<CFFactor> &, const List<CFFactor> & ); 87 template List<CFAFactor> Union ( const List<CFAFactor> &, const List<CFAFactor> & ); 81 88 82 89 #if ! defined(WINNT) || defined(__GNUC__) -
factory/include/factory/Makefile.am
r552d26 r2391e4 2 2 3 3 templateincl = templates/ftmpl_array.h \ 4 templates/ftmpl_afactor.h \ 4 5 templates/ftmpl_factor.h \ 5 6 templates/ftmpl_list.h \ -
libpolys/polys/clapconv.cc
r552d26 r2391e4 319 319 { 320 320 n_Normalize(p_GetCoeff(p, r), r->cf); 321 CanonicalForm term=convSingPFactoryP(NUM(p_GetCoeff(p, r)),r->cf->extRing); 322 323 if ((DEN(p_GetCoeff(p,r))!=NULL) 324 && (!errorreported)) 325 { 321 322 // test if denominator is constant 323 if (!p_IsConstantPoly(DEN (p_GetCoeff (p,r)),r) && !errorreported) 326 324 WerrorS("conversion error: denominator!= 1"); 325 326 CanonicalForm term=convSingPFactoryP(NUM (p_GetCoeff(p, r)),r->cf->extRing); 327 328 // if denominator is not NULL it should be a constant at this point 329 if (DEN (p_GetCoeff(p,r)) != NULL) 330 { 331 CanonicalForm den= convSingPFactoryP(DEN (p_GetCoeff(p, r)),r->cf->extRing); 332 if (rChar (r) == 0) 333 On (SW_RATIONAL); 334 term /= den; 327 335 } 328 336 -
libpolys/polys/clapsing.cc
r552d26 r2391e4 1025 1025 return res; 1026 1026 } 1027 #ifdef HAVE_NTL 1028 ideal singclap_absBiFactorize ( poly f, ideal & mipos, intvec ** exps, int & numFactors, const ring r) 1029 { 1030 p_Test(f, r); 1031 1032 ideal res=NULL; 1033 1034 int offs = rPar(r); 1035 if (f==NULL) 1036 { 1037 res= idInit (1, 1); 1038 mipos= idInit (1, 1); 1039 mipos->m[0]= convFactoryPSingTrP (Variable (offs), r); //overkill 1040 (*exps)=new intvec (1); 1041 (**exps)[0]= 1; 1042 numFactors= 0; 1043 return res; 1044 } 1045 CanonicalForm F( convSingTrPFactoryP( f, r) ); 1046 1047 if (getNumVars (F) > 2) 1048 { 1049 WerrorS( feNotImplemented ); 1050 return res; 1051 } 1052 CFAFList absFactors= absFactorize (F); 1053 1054 int n= absFactors.length(); 1055 *exps=new intvec (n); 1056 1057 res= idInit (n, 1); 1058 1059 mipos= idInit (n, 1); 1060 1061 Variable x= Variable (offs); 1062 Variable alpha; 1063 int i= 0; 1064 numFactors= 0; 1065 int count; 1066 CFAFListIterator iter= absFactors; 1067 CanonicalForm lead= iter.getItem().factor(); 1068 if (iter.getItem().factor().inCoeffDomain()) 1069 { 1070 i++; 1071 iter++; 1072 } 1073 bool isRat= isOn (SW_RATIONAL); 1074 if (!isRat) 1075 On (SW_RATIONAL); 1076 for (; iter.hasItem(); iter++, i++) 1077 { 1078 (**exps)[i]= iter.getItem().exp(); 1079 alpha= iter.getItem().minpoly().mvar(); 1080 if (iter.getItem().minpoly().isOne()) 1081 lead /= power (bCommonDen (iter.getItem().factor()), iter.getItem().exp()); 1082 else 1083 lead /= power (power (bCommonDen (iter.getItem().factor()), degree (iter.getItem().minpoly())), iter.getItem().exp()); 1084 res->m[i]= convFactoryPSingTrP (replacevar (iter.getItem().factor()*bCommonDen (iter.getItem().factor()), alpha, x), r); 1085 if (iter.getItem().minpoly().isOne()) 1086 { 1087 count= iter.getItem().exp(); 1088 mipos->m[i]= convFactoryPSingTrP (x,r); 1089 } 1090 else 1091 { 1092 count= iter.getItem().exp()*degree (iter.getItem().minpoly()); 1093 mipos->m[i]= convFactoryPSingTrP (replacevar (iter.getItem().minpoly(), alpha, x), r); 1094 } 1095 numFactors += count; 1096 } 1097 if (!isRat) 1098 Off (SW_RATIONAL); 1099 1100 (**exps)[0]= 1; 1101 res->m[0]= convFactoryPSingTrP (lead, r); 1102 mipos->m[0]= convFactoryPSingTrP (x, r); 1103 return res; 1104 } 1105 #endif 1027 1106 ideal singclap_sqrfree ( poly f, intvec ** v , int with_exps, const ring r) 1028 1107 { -
libpolys/polys/clapsing.h
r552d26 r2391e4 51 51 matrix singntl_LLL(matrix A, const ring r); 52 52 intvec* singntl_LLL(intvec* A, const ring r); 53 ideal singclap_absBiFactorize ( poly f, ideal & mipos, intvec ** exps, int & n, const ring r); 53 54 #endif 54 55 #endif
Note: See TracChangeset
for help on using the changeset viewer.