Changeset 052af1 in git
- Timestamp:
- Sep 29, 2016, 12:08:34 PM (8 years ago)
- Branches:
- (u'fieker-DuVal', '117eb8c30fc9e991c4decca4832b1d19036c4c65')(u'spielwiese', 'b4f17ed1d25f93d46dbe29e4b499baecc2fd51bb')
- Children:
- 781011ad928c92d557a10b3cd56d83c3b0a0277b
- Parents:
- d3f9bb894c684ed67a0c0c6ab1ece2e380413a24
- git-author:
- Andreas Steenpass <steenpass@mathematik.uni-kl.de>2016-09-29 12:08:34+02:00
- git-committer:
- Andreas Steenpass <steenpass@mathematik.uni-kl.de>2017-12-15 12:17:07+01:00
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/GBEngine/syz4.cc
rd3f9bb8 r052af1 14 14 #include <vector> 15 15 #include <map> 16 17 typedef struct {18 poly lt;19 unsigned long sev;20 unsigned int comp;21 } lt_struct;22 23 typedef std::vector<lt_struct> lts_vector;24 typedef std::map<long, lts_vector> lts_hash;25 26 static void initialize_lts_hash(lts_hash &C, const ideal L)27 {28 const ring R = currRing;29 const unsigned int n_elems = IDELEMS(L);30 for (unsigned int k = 0; k < n_elems; k++) {31 const poly a = L->m[k];32 C[p_GetComp(a, R)].push_back({a, p_GetShortExpVector(a, R), k});33 }34 }35 36 #define delete_lts_hash(C) C->clear()37 38 bool is_divisible(const lts_hash *C, const poly p)39 {40 const ring R = currRing;41 lts_hash::const_iterator itr = C->find(p_GetComp(p, R));42 if (itr == C->end()) {43 return false;44 }45 lts_vector::const_iterator v_current = itr->second.begin();46 lts_vector::const_iterator v_finish = itr->second.end();47 const unsigned long not_sev = ~p_GetShortExpVector(p, R);48 for ( ; v_current != v_finish; ++v_current) {49 if (p_LmShortDivisibleByNoComp(v_current->lt, v_current->sev,50 p, not_sev, R)) {51 return true;52 }53 }54 return false;55 }56 57 static poly TraverseTail_test(poly multiplier, const int tail,58 const ideal previous_module, const std::vector<bool> &variables,59 const lts_hash *m_div, const lts_hash *m_checker);60 static poly ComputeImage_test(poly multiplier, const int tail,61 const ideal previous_module, const std::vector<bool> &variables,62 const lts_hash *m_div, const lts_hash *m_checker);63 static inline poly ReduceTerm_test(poly multiplier, poly term4reduction,64 poly syztermCheck, const ideal previous_module,65 const std::vector<bool> &variables, const lts_hash *m_div,66 const lts_hash *m_checker);67 static poly leadmonom_test(const poly p, const ring r, const bool bSetZeroComp = true);68 16 69 17 static inline void update_variables(std::vector<bool> &variables, … … 99 47 } 100 48 101 static poly TraverseNF_test(const poly a, const ideal previous_module, 49 typedef struct { 50 poly lt; 51 unsigned long sev; 52 unsigned int comp; 53 } lt_struct; 54 55 typedef std::vector<lt_struct> lts_vector; 56 typedef std::map<long, lts_vector> lts_hash; 57 58 static void initialize_lts_hash(lts_hash &C, const ideal L) 59 { 60 const ring R = currRing; 61 const unsigned int n_elems = IDELEMS(L); 62 for (unsigned int k = 0; k < n_elems; k++) { 63 const poly a = L->m[k]; 64 C[p_GetComp(a, R)].push_back({a, p_GetShortExpVector(a, R), k}); 65 } 66 } 67 68 #define delete_lts_hash(C) C->clear() 69 70 bool is_divisible(const lts_hash *C, const poly p) 71 { 72 const ring R = currRing; 73 lts_hash::const_iterator itr = C->find(p_GetComp(p, R)); 74 if (itr == C->end()) { 75 return false; 76 } 77 lts_vector::const_iterator v_current = itr->second.begin(); 78 lts_vector::const_iterator v_finish = itr->second.end(); 79 const unsigned long not_sev = ~p_GetShortExpVector(p, R); 80 for ( ; v_current != v_finish; ++v_current) { 81 if (p_LmShortDivisibleByNoComp(v_current->lt, v_current->sev, 82 p, not_sev, R)) { 83 return true; 84 } 85 } 86 return false; 87 } 88 89 static poly leadmonom_test(const poly p, const ring r, 90 const bool bSetZeroComp = true) 91 { 92 poly m = p_LmInit(p, r); 93 p_SetCoeff0(m, n_Copy(p_GetCoeff(p, r), r), r); 94 if( bSetZeroComp ) 95 p_SetComp(m, 0, r); 96 p_Setm(m, r); 97 return m; 98 } 99 100 // _p_LmDivisibleByNoComp for a | b*c 101 static inline BOOLEAN _p_LmDivisibleByNoComp(const poly a, const poly b, const poly c, const ring r) 102 { 103 int i=r->VarL_Size - 1; 104 unsigned long divmask = r->divmask; 105 unsigned long la, lb; 106 107 if (r->VarL_LowIndex >= 0) 108 { 109 i += r->VarL_LowIndex; 110 do 111 { 112 la = a->exp[i]; 113 lb = b->exp[i] + c->exp[i]; 114 if ((la > lb) || 115 (((la & divmask) ^ (lb & divmask)) != ((lb - la) & divmask))) 116 { 117 return FALSE; 118 } 119 i--; 120 } 121 while (i>=r->VarL_LowIndex); 122 } 123 else 124 { 125 do 126 { 127 la = a->exp[r->VarL_Offset[i]]; 128 lb = b->exp[r->VarL_Offset[i]] + c->exp[r->VarL_Offset[i]]; 129 if ((la > lb) || 130 (((la & divmask) ^ (lb & divmask)) != ((lb - la) & divmask))) 131 { 132 return FALSE; 133 } 134 i--; 135 } 136 while (i>=0); 137 } 138 return TRUE; 139 } 140 141 poly FindReducer(const poly multiplier, const poly t, const poly syzterm, 142 const lts_hash *syz_checker, const lts_hash *m_div) 143 { 144 const ring r = currRing; 145 lts_hash::const_iterator m_itr = m_div->find(p_GetComp(t, currRing)); 146 if (m_itr == m_div->end()) { 147 return NULL; 148 } 149 lts_vector::const_iterator m_current = (m_itr->second).begin(); 150 lts_vector::const_iterator m_finish = (m_itr->second).end(); 151 if (m_current == m_finish) { 152 return NULL; 153 } 154 const poly q = p_New(r); 155 pNext(q) = NULL; 156 const unsigned long m_not_sev = ~p_GetShortExpVector(multiplier, t, r); 157 for( ; m_current != m_finish; ++m_current) { 158 if ( (m_current->sev & m_not_sev) 159 || !(_p_LmDivisibleByNoComp(m_current->lt, multiplier, t, r))) { 160 continue; 161 } 162 const poly p = m_current->lt; 163 const int k = m_current->comp; 164 p_ExpVectorSum(q, multiplier, t, r); // q == product == multiplier * t 165 p_ExpVectorDiff(q, q, p, r); // (LM(product) / LM(L[k])) 166 p_SetComp(q, k + 1, r); 167 p_Setm(q, r); 168 // cannot allow something like: a*gen(i) - a*gen(i) 169 if (syzterm != NULL && (k == p_GetComp(syzterm, r) - 1) 170 && p_ExpVectorEqual(syzterm, q, r)) { 171 continue; 172 } 173 if (is_divisible(syz_checker, q)) { 174 continue; 175 } 176 number n = n_Mult(p_GetCoeff(multiplier, r), p_GetCoeff(t, r), r); 177 p_SetCoeff0(q, n_InpNeg(n, r), r); 178 return q; 179 } 180 p_LmFree(q, r); 181 return NULL; 182 } 183 184 static poly TraverseTail_test(poly multiplier, const int tail, 185 const ideal previous_module, const std::vector<bool> &variables, 186 const lts_hash *m_div, const lts_hash *m_checker); 187 188 static inline poly ReduceTerm_test(poly multiplier, poly term4reduction, 189 poly syztermCheck, const ideal previous_module, 102 190 const std::vector<bool> &variables, const lts_hash *m_div, 103 191 const lts_hash *m_checker) 104 192 { 105 const ring R = currRing; 106 const int r = p_GetComp(a, R) - 1; 107 poly aa = leadmonom_test(a, R); 108 poly t = TraverseTail_test(aa, r, previous_module, variables, m_div, 109 m_checker); 110 if (check_variables(variables, aa)) { 111 t = p_Add_q(t, ReduceTerm_test(aa, previous_module->m[r], a, 112 previous_module, variables, m_div, m_checker), R); 113 } 114 p_Delete(&aa, R); 115 return t; 193 const ring r = currRing; 194 poly s = FindReducer(multiplier, term4reduction, syztermCheck, m_checker, 195 m_div); 196 if( s == NULL ) 197 { 198 return NULL; 199 } 200 poly b = leadmonom_test(s, r); 201 const int c = p_GetComp(s, r) - 1; 202 const poly t 203 = TraverseTail_test(b, c, previous_module, variables, m_div, m_checker); 204 pDelete(&b); 205 if( t != NULL ) 206 s = p_Add_q(s, t, r); 207 return s; 208 } 209 210 static poly ComputeImage_test(poly multiplier, const int t, 211 const ideal previous_module, const std::vector<bool> &variables, 212 const lts_hash *m_div, const lts_hash *m_checker) 213 { 214 const poly tail = previous_module->m[t]->next; 215 if(tail != NULL) 216 { 217 if (!check_variables(variables, multiplier)) 218 { 219 return NULL; 220 } 221 sBucket_pt sum = sBucketCreate(currRing); 222 for(poly p = tail; p != NULL; p = pNext(p)) // iterate over the tail 223 { 224 const poly rt = ReduceTerm_test(multiplier, p, NULL, previous_module, 225 variables, m_div, m_checker); 226 sBucket_Add_p(sum, rt, pLength(rt)); 227 } 228 poly s; 229 int l; 230 sBucketClearAdd(sum, &s, &l); 231 sBucketDestroy(&sum); 232 return s; 233 } 234 return NULL; 116 235 } 117 236 … … 240 359 } 241 360 242 static poly ComputeImage_test(poly multiplier, const int t, 243 const ideal previous_module, const std::vector<bool> &variables, 244 const lts_hash *m_div, const lts_hash *m_checker) 245 { 246 const poly tail = previous_module->m[t]->next; 247 if(tail != NULL) 248 { 249 if (!check_variables(variables, multiplier)) 250 { 251 return NULL; 252 } 253 sBucket_pt sum = sBucketCreate(currRing); 254 for(poly p = tail; p != NULL; p = pNext(p)) // iterate over the tail 255 { 256 const poly rt = ReduceTerm_test(multiplier, p, NULL, previous_module, 257 variables, m_div, m_checker); 258 sBucket_Add_p(sum, rt, pLength(rt)); 259 } 260 poly s; 261 int l; 262 sBucketClearAdd(sum, &s, &l); 263 sBucketDestroy(&sum); 264 return s; 265 } 266 return NULL; 267 } 268 269 static poly leadmonom_test(const poly p, const ring r, const bool bSetZeroComp) 270 { 271 poly m = p_LmInit(p, r); 272 p_SetCoeff0(m, n_Copy(p_GetCoeff(p, r), r), r); 273 if( bSetZeroComp ) 274 p_SetComp(m, 0, r); 275 p_Setm(m, r); 276 return m; 277 } 278 279 // _p_LmDivisibleByNoComp for a | b*c 280 static inline BOOLEAN _p_LmDivisibleByNoComp(const poly a, const poly b, const poly c, const ring r) 281 { 282 int i=r->VarL_Size - 1; 283 unsigned long divmask = r->divmask; 284 unsigned long la, lb; 285 286 if (r->VarL_LowIndex >= 0) 287 { 288 i += r->VarL_LowIndex; 289 do 290 { 291 la = a->exp[i]; 292 lb = b->exp[i] + c->exp[i]; 293 if ((la > lb) || 294 (((la & divmask) ^ (lb & divmask)) != ((lb - la) & divmask))) 295 { 296 return FALSE; 297 } 298 i--; 299 } 300 while (i>=r->VarL_LowIndex); 301 } 302 else 303 { 304 do 305 { 306 la = a->exp[r->VarL_Offset[i]]; 307 lb = b->exp[r->VarL_Offset[i]] + c->exp[r->VarL_Offset[i]]; 308 if ((la > lb) || 309 (((la & divmask) ^ (lb & divmask)) != ((lb - la) & divmask))) 310 { 311 return FALSE; 312 } 313 i--; 314 } 315 while (i>=0); 316 } 317 return TRUE; 318 } 319 320 poly FindReducer(const poly multiplier, const poly t, const poly syzterm, 321 const lts_hash *syz_checker, const lts_hash *m_div) 322 { 323 const ring r = currRing; 324 lts_hash::const_iterator m_itr = m_div->find(p_GetComp(t, currRing)); 325 if (m_itr == m_div->end()) { 326 return NULL; 327 } 328 lts_vector::const_iterator m_current = (m_itr->second).begin(); 329 lts_vector::const_iterator m_finish = (m_itr->second).end(); 330 if (m_current == m_finish) { 331 return NULL; 332 } 333 const poly q = p_New(r); 334 pNext(q) = NULL; 335 const unsigned long m_not_sev = ~p_GetShortExpVector(multiplier, t, r); 336 for( ; m_current != m_finish; ++m_current) { 337 if ( (m_current->sev & m_not_sev) 338 || !(_p_LmDivisibleByNoComp(m_current->lt, multiplier, t, r))) { 339 continue; 340 } 341 const poly p = m_current->lt; 342 const int k = m_current->comp; 343 p_ExpVectorSum(q, multiplier, t, r); // q == product == multiplier * t 344 p_ExpVectorDiff(q, q, p, r); // (LM(product) / LM(L[k])) 345 p_SetComp(q, k + 1, r); 346 p_Setm(q, r); 347 // cannot allow something like: a*gen(i) - a*gen(i) 348 if (syzterm != NULL && (k == p_GetComp(syzterm, r) - 1) 349 && p_ExpVectorEqual(syzterm, q, r)) { 350 continue; 351 } 352 if (is_divisible(syz_checker, q)) { 353 continue; 354 } 355 number n = n_Mult(p_GetCoeff(multiplier, r), p_GetCoeff(t, r), r); 356 p_SetCoeff0(q, n_InpNeg(n, r), r); 357 return q; 358 } 359 p_LmFree(q, r); 360 return NULL; 361 } 362 363 static inline poly ReduceTerm_test(poly multiplier, poly term4reduction, 364 poly syztermCheck, const ideal previous_module, 361 static poly TraverseNF_test(const poly a, const ideal previous_module, 365 362 const std::vector<bool> &variables, const lts_hash *m_div, 366 363 const lts_hash *m_checker) 367 364 { 368 const ring r = currRing; 369 poly s = FindReducer(multiplier, term4reduction, syztermCheck, m_checker, 370 m_div); 371 if( s == NULL ) 372 { 373 return NULL; 374 } 375 poly b = leadmonom_test(s, r); 376 const int c = p_GetComp(s, r) - 1; 377 const poly t 378 = TraverseTail_test(b, c, previous_module, variables, m_div, m_checker); 379 pDelete(&b); 380 if( t != NULL ) 381 s = p_Add_q(s, t, r); 382 return s; 365 const ring R = currRing; 366 const int r = p_GetComp(a, R) - 1; 367 poly aa = leadmonom_test(a, R); 368 poly t = TraverseTail_test(aa, r, previous_module, variables, m_div, 369 m_checker); 370 if (check_variables(variables, aa)) { 371 t = p_Add_q(t, ReduceTerm_test(aa, previous_module->m[r], a, 372 previous_module, variables, m_div, m_checker), R); 373 } 374 p_Delete(&aa, R); 375 return t; 383 376 } 384 377
Note: See TracChangeset
for help on using the changeset viewer.