Changeset 78321f in git for Singular/iparith.cc
- Timestamp:
- Sep 7, 2016, 1:48:32 PM (8 years ago)
- Branches:
- (u'fieker-DuVal', '117eb8c30fc9e991c4decca4832b1d19036c4c65')(u'spielwiese', 'c5facdfddea2addfd91babd8b9019161dea4b695')
- Children:
- 5600a4f5be2705b151d6d42fac572d137ff0924baf7c4768f3e8796ec97be6a476aa97989adfb24be1ccd6716e34657f35d7ef3c0a08f29295742d93
- Parents:
- 033ee4c3785984b97c01cc69a5a7ab06992d0c2d
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
Singular/iparith.cc
r033ee4c r78321f 95 95 96 96 ring rCompose(const lists L, const BOOLEAN check_comp=TRUE); 97 98 97 99 98 // defaults for all commands: NO_PLURAL | NO_RING | ALLOW_ZERODIVISOR … … 1764 1763 return FALSE; 1765 1764 } 1766 static BOOLEAN jjCHINREM_ID(leftv res, leftv u, leftv v) 1767 { 1768 coeffs cf; 1769 lists c=(lists)u->CopyD(); // list of ideal or bigint/int 1770 lists pl=NULL; 1771 intvec *p=NULL; 1772 if (v->Typ()==LIST_CMD) pl=(lists)v->Data(); 1773 else p=(intvec*)v->Data(); 1774 int rl=c->nr+1; 1775 ideal result; 1776 ideal *x=(ideal *)omAlloc(rl*sizeof(ideal)); 1777 number *xx=NULL; 1778 int i; 1779 int return_type=c->m[0].Typ(); 1780 if ((return_type!=IDEAL_CMD) 1781 && (return_type!=MODUL_CMD) 1782 && (return_type!=MATRIX_CMD) 1783 && (return_type!=POLY_CMD)) 1784 { 1785 if((return_type!=BIGINT_CMD)&&(return_type!=INT_CMD)) 1786 { 1787 WerrorS("poly/ideal/module/matrix expected"); 1788 omFree(x); // delete c 1789 return TRUE; 1790 } 1791 else 1792 return_type=BIGINT_CMD; 1793 } 1794 if (return_type==BIGINT_CMD) 1795 cf=coeffs_BIGINT; 1796 else 1797 { 1798 cf=currRing->cf; 1799 if (nCoeff_is_Extension(cf) && (cf->extRing!=NULL)) 1800 cf=cf->extRing->cf; 1801 } 1802 nMapFunc nMap=n_SetMap(coeffs_BIGINT,cf); 1803 if (return_type!=BIGINT_CMD) 1804 { 1805 for(i=rl-1;i>=0;i--) 1806 { 1807 if (c->m[i].Typ()!=return_type) 1808 { 1809 Werror("%s expected at pos %d",Tok2Cmdname(return_type),i+1); 1810 omFree(x); // delete c 1811 return TRUE; 1812 } 1813 if (return_type==POLY_CMD) 1814 { 1815 x[i]=idInit(1,1); 1816 x[i]->m[0]=(poly)c->m[i].CopyD(); 1817 } 1818 else 1819 { 1820 x[i]=(ideal)c->m[i].CopyD(); 1821 } 1822 //c->m[i].Init(); 1823 } 1824 } 1825 else 1826 { 1827 if (nMap==NULL) 1828 { 1829 Werror("not implemented: map bigint -> %s", nCoeffString(cf)); 1830 return TRUE; 1831 } 1832 xx=(number *)omAlloc(rl*sizeof(number)); 1833 for(i=rl-1;i>=0;i--) 1834 { 1835 if (c->m[i].Typ()==INT_CMD) 1836 { 1837 xx[i]=n_Init(((int)(long)c->m[i].Data()),cf); 1838 } 1839 else if (c->m[i].Typ()==BIGINT_CMD) 1840 { 1841 xx[i]=nMap((number)c->m[i].Data(),coeffs_BIGINT,cf); 1842 } 1843 else 1844 { 1845 Werror("bigint expected at pos %d",i+1); 1846 omFree(x); // delete c 1847 omFree(xx); // delete c 1848 return TRUE; 1849 } 1850 } 1851 } 1852 number *q=(number *)omAlloc(rl*sizeof(number)); 1853 if (p!=NULL) 1854 { 1855 for(i=rl-1;i>=0;i--) 1856 { 1857 q[i]=n_Init((*p)[i], cf); 1858 } 1859 } 1860 else 1861 { 1862 for(i=rl-1;i>=0;i--) 1863 { 1864 if (pl->m[i].Typ()==INT_CMD) 1865 { 1866 q[i]=n_Init((int)(long)pl->m[i].Data(),cf); 1867 } 1868 else if (pl->m[i].Typ()==BIGINT_CMD) 1869 { 1870 q[i]=nMap((number)(pl->m[i].Data()),coeffs_BIGINT,cf); 1871 } 1872 else 1873 { 1874 Werror("bigint expected at pos %d",i+1); 1875 for(i++;i<rl;i++) 1876 { 1877 n_Delete(&(q[i]),cf); 1878 } 1879 omFree(x); // delete c 1880 omFree(q); // delete pl 1881 if (xx!=NULL) omFree(xx); // delete c 1882 return TRUE; 1883 } 1884 } 1885 } 1886 if (return_type==BIGINT_CMD) 1887 { 1888 CFArray i_v(rl); 1889 number n=n_ChineseRemainderSym(xx,q,rl,TRUE,i_v,coeffs_BIGINT); 1890 res->data=(char *)n; 1891 } 1892 else 1893 { 1894 result=id_ChineseRemainder(x,q,rl,currRing); 1895 // deletes also x 1896 c->Clean(); 1897 if ((return_type==POLY_CMD) &&(result!=NULL)) 1898 { 1899 res->data=(char *)result->m[0]; 1900 result->m[0]=NULL; 1901 idDelete(&result); 1902 } 1903 else 1904 res->data=(char *)result; 1905 } 1906 for(i=rl-1;i>=0;i--) 1907 { 1908 n_Delete(&(q[i]),cf); 1909 } 1910 omFree(q); 1911 res->rtyp=return_type; 1912 return result==NULL; 1913 } 1765 static BOOLEAN jjCHINREM_ID(leftv res, leftv u, leftv v); 1914 1766 static BOOLEAN jjCOEF(leftv res, leftv u, leftv v) 1915 1767 { … … 2270 2122 return FALSE; 2271 2123 } 2124 static BOOLEAN jjFAREY_LI(leftv res, leftv u, leftv v); 2272 2125 static BOOLEAN jjFETCH(leftv res, leftv u, leftv v) 2273 2126 { … … 9261 9114 return FALSE; 9262 9115 } 9116 // -------------------------------------------------------------------- 9117 static BOOLEAN jjCHINREM_ID(leftv res, leftv u, leftv v) 9118 { 9119 coeffs cf; 9120 lists c=(lists)u->CopyD(); // list of ideal or bigint/int 9121 int rl=c->nr+1; 9122 int return_type=c->m[0].Typ(); 9123 if ((return_type!=IDEAL_CMD) 9124 && (return_type!=MODUL_CMD) 9125 && (return_type!=MATRIX_CMD) 9126 && (return_type!=POLY_CMD)) 9127 { 9128 if((return_type==BIGINT_CMD) 9129 ||(return_type==INT_CMD)) 9130 return_type=BIGINT_CMD; 9131 else if (return_type==LIST_CMD) 9132 { 9133 // create a tmp list of the correct size 9134 lists res_l=(lists)omAllocBin(slists_bin); 9135 res_l->Init(rl /*c->nr+1*/); 9136 BOOLEAN bo=FALSE; 9137 int tab_pos=iiTabIndex(dArithTab2,JJTAB2LEN,CHINREM_CMD); 9138 for (unsigned i=0;i<=(unsigned)c->nr;i++) 9139 { 9140 sleftv tmp; 9141 tmp.Copy(v); 9142 bo=iiExprArith2TabIntern(&res_l->m[i],&c->m[i],CHINREM_CMD,&tmp,TRUE,dArith2+tab_pos,c->m[i].rtyp,tmp.rtyp,dConvertTypes); 9143 tmp.CleanUp(); 9144 if (bo) { Werror("chinrem failed for list entry %d",i+1); break;} 9145 } 9146 c->Clean(); 9147 res->data=res_l; 9148 res->rtyp=LIST_CMD; 9149 return bo; 9150 } 9151 else 9152 { 9153 c->Clean(); 9154 WerrorS("poly/ideal/module/matrix/list expected"); 9155 return TRUE; 9156 } 9157 } 9158 if (return_type==BIGINT_CMD) 9159 cf=coeffs_BIGINT; 9160 else 9161 { 9162 cf=currRing->cf; 9163 if (nCoeff_is_Extension(cf) && (cf->extRing!=NULL)) 9164 cf=cf->extRing->cf; 9165 } 9166 lists pl=NULL; 9167 intvec *p=NULL; 9168 if (v->Typ()==LIST_CMD) pl=(lists)v->Data(); 9169 else p=(intvec*)v->Data(); 9170 ideal result; 9171 ideal *x=(ideal *)omAlloc(rl*sizeof(ideal)); 9172 number *xx=NULL; 9173 nMapFunc nMap=n_SetMap(coeffs_BIGINT,cf); 9174 int i; 9175 if (return_type!=BIGINT_CMD) 9176 { 9177 for(i=rl-1;i>=0;i--) 9178 { 9179 if (c->m[i].Typ()!=return_type) 9180 { 9181 Werror("%s expected at pos %d",Tok2Cmdname(return_type),i+1); 9182 omFree(x); // delete c 9183 return TRUE; 9184 } 9185 if (return_type==POLY_CMD) 9186 { 9187 x[i]=idInit(1,1); 9188 x[i]->m[0]=(poly)c->m[i].CopyD(); 9189 } 9190 else 9191 { 9192 x[i]=(ideal)c->m[i].CopyD(); 9193 } 9194 //c->m[i].Init(); 9195 } 9196 } 9197 else 9198 { 9199 if (nMap==NULL) 9200 { 9201 Werror("not implemented: map bigint -> %s", nCoeffString(cf)); 9202 return TRUE; 9203 } 9204 xx=(number *)omAlloc(rl*sizeof(number)); 9205 for(i=rl-1;i>=0;i--) 9206 { 9207 if (c->m[i].Typ()==INT_CMD) 9208 { 9209 xx[i]=n_Init(((int)(long)c->m[i].Data()),cf); 9210 } 9211 else if (c->m[i].Typ()==BIGINT_CMD) 9212 { 9213 xx[i]=nMap((number)c->m[i].Data(),coeffs_BIGINT,cf); 9214 } 9215 else 9216 { 9217 Werror("bigint expected at pos %d",i+1); 9218 omFree(x); // delete c 9219 omFree(xx); // delete c 9220 return TRUE; 9221 } 9222 } 9223 } 9224 number *q=(number *)omAlloc(rl*sizeof(number)); 9225 if (p!=NULL) 9226 { 9227 for(i=rl-1;i>=0;i--) 9228 { 9229 q[i]=n_Init((*p)[i], cf); 9230 } 9231 } 9232 else 9233 { 9234 for(i=rl-1;i>=0;i--) 9235 { 9236 if (pl->m[i].Typ()==INT_CMD) 9237 { 9238 q[i]=n_Init((int)(long)pl->m[i].Data(),cf); 9239 } 9240 else if (pl->m[i].Typ()==BIGINT_CMD) 9241 { 9242 q[i]=nMap((number)(pl->m[i].Data()),coeffs_BIGINT,cf); 9243 } 9244 else 9245 { 9246 Werror("bigint expected at pos %d",i+1); 9247 for(i++;i<rl;i++) 9248 { 9249 n_Delete(&(q[i]),cf); 9250 } 9251 omFree(x); // delete c 9252 omFree(q); // delete pl 9253 if (xx!=NULL) omFree(xx); // delete c 9254 return TRUE; 9255 } 9256 } 9257 } 9258 if (return_type==BIGINT_CMD) 9259 { 9260 CFArray i_v(rl); 9261 number n=n_ChineseRemainderSym(xx,q,rl,TRUE,i_v,coeffs_BIGINT); 9262 res->data=(char *)n; 9263 } 9264 else 9265 { 9266 result=id_ChineseRemainder(x,q,rl,currRing); // deletes also x 9267 c->Clean(); 9268 if ((return_type==POLY_CMD) &&(result!=NULL)) 9269 { 9270 res->data=(char *)result->m[0]; 9271 result->m[0]=NULL; 9272 idDelete(&result); 9273 } 9274 else 9275 res->data=(char *)result; 9276 } 9277 for(i=rl-1;i>=0;i--) 9278 { 9279 n_Delete(&(q[i]),cf); 9280 } 9281 omFree(q); 9282 res->rtyp=return_type; 9283 return result==NULL; 9284 } 9285 static BOOLEAN jjFAREY_LI(leftv res, leftv u, leftv v) 9286 { 9287 lists c=(lists)u->CopyD(); 9288 lists res_l=(lists)omAllocBin(slists_bin); 9289 res_l->Init(c->nr+1); 9290 BOOLEAN bo=FALSE; 9291 int tab_pos=iiTabIndex(dArithTab2,JJTAB2LEN,FAREY_CMD); 9292 for (unsigned i=0;i<=(unsigned)c->nr;i++) 9293 { 9294 sleftv tmp; 9295 tmp.Copy(v); 9296 bo=iiExprArith2TabIntern(&res_l->m[i],&c->m[i],FAREY_CMD,&tmp,TRUE,dArith2+tab_pos,c->m[i].rtyp,tmp.rtyp,dConvertTypes); 9297 tmp.CleanUp(); 9298 if (bo) { Werror("farey failed for list entry %d",i+1); break;} 9299 } 9300 c->Clean(); 9301 res->data=res_l; 9302 return bo; 9303 }
Note: See TracChangeset
for help on using the changeset viewer.