2231{
2234
2237
2241
2242 mpz_t t_zaehler, t_nenner;
2243 mpz_init(t_zaehler);
2244 mpz_init(t_nenner);
2245
2246 mpz_t s_zaehler, s_nenner, temp, MwWd;
2247 mpz_init(s_zaehler);
2248 mpz_init(s_nenner);
2249 mpz_init(temp);
2250 mpz_init(MwWd);
2251
2252 mpz_t sing_int;
2253 mpz_init(sing_int);
2254 mpz_set_ui(sing_int, 2147483647);
2255
2256 mpz_t sing_int_half;
2257 mpz_init(sing_int_half);
2258 mpz_set_ui(sing_int_half, 3*(1073741824/2));
2259
2260 mpz_t deg_w0_p1, deg_d0_p1;
2261 mpz_init(deg_w0_p1);
2262 mpz_init(deg_d0_p1);
2263
2264 mpz_t sztn, sntz;
2265 mpz_init(sztn);
2266 mpz_init(sntz);
2267
2268 mpz_t t_null;
2269 mpz_init(t_null);
2270
2271 mpz_t ggt;
2272 mpz_init(ggt);
2273
2274 mpz_t dcw;
2275 mpz_init(dcw);
2276
2277 int gcd_tmp;
2278
2279
2282
2283
2285 {
2286 for (
j=0;
j<nRing;
j++)
2287 {
2288 (*diff_weight1)[
j] = (*curr_weight)[
j];
2289 }
2291 {
2292 for(
j=0;
j<nRing;
j++)
2293 {
2294 (*curr_weight)[
j] = (*diff_weight1)[
j];
2295 }
2296 for(
j=0;
j<nRing;
j++)
2297 {
2298 (*diff_weight1)[
j] = ((*diff_weight1)[
j] + 5) / 10;
2299 }
2300 }
2301
2303 {
2304 for(
j=0;
j<nRing;
j++)
2305 {
2306 (*diff_weight1)[
j] = (*curr_weight)[
j];
2307 }
2310 {
2311 (*curr_weight)[
j] = (*diff_weight1)[
j];
2313 (*diff_weight1)[
j] = ((*diff_weight1)[
j] + 5) / 10;
2314 }
2315 }
2316
2317 }
2318 intvec* diff_weight =
MivSub(target_weight, curr_weight);
2319
2320
2321 for (
j=0;
j<nG;
j++)
2322 {
2325 {
2329 delete ivtemp;
2330
2333 {
2336 mpz_sub(s_zaehler, deg_w0_p1, MwWd);
2337 if(mpz_cmp(s_zaehler, t_null) != 0)
2338 {
2340 mpz_sub(s_nenner, MwWd, deg_d0_p1);
2341
2342 if( (mpz_cmp(s_zaehler,t_null) > 0 &&
2343 mpz_cmp(s_nenner, s_zaehler)>=0) ||
2344 (mpz_cmp(s_zaehler, t_null) < 0 &&
2345 mpz_cmp(s_nenner, s_zaehler)<=0))
2346 {
2347
2348 if (mpz_cmp(s_zaehler, t_null) < 0)
2349 {
2350 mpz_neg(s_zaehler, s_zaehler);
2351 mpz_neg(s_nenner, s_nenner);
2352 }
2353
2354
2355 cancel(s_zaehler, s_nenner);
2356
2357 if(mpz_cmp(t_nenner, t_null) != 0)
2358 {
2359 mpz_mul(sztn, s_zaehler, t_nenner);
2360 mpz_mul(sntz, s_nenner, t_zaehler);
2361
2362 if(mpz_cmp(sztn,sntz) < 0)
2363 {
2364 mpz_add(t_nenner, t_null, s_nenner);
2365 mpz_add(t_zaehler,t_null, s_zaehler);
2366 }
2367 }
2368 else
2369 {
2370 mpz_add(t_nenner, t_null, s_nenner);
2371 mpz_add(t_zaehler,t_null, s_zaehler);
2372 }
2373 }
2374 }
2376 delete ivtemp;
2377 }
2378 }
2379 }
2380
2381 mpz_t *
vec=(mpz_t*)
omAlloc(nRing*
sizeof(mpz_t));
2382
2383
2384
2385
2386 if(mpz_cmp(t_nenner, t_null) == 0)
2387 {
2388#ifndef SING_NDEBUG
2389
2390#endif
2391 delete diff_weight;
2392 diff_weight =
ivCopy(curr_weight);
2393 goto FINISH;
2394 }
2395
2396
2397 if(mpz_cmp_si(t_nenner, 1)==0 && mpz_cmp_si(t_zaehler,1)==0)
2398 {
2399 delete diff_weight;
2400 diff_weight =
ivCopy(target_weight);
2401 goto FINISH;
2402 }
2403
2404
2405
2406
2407 gcd_tmp = (*curr_weight)[0];
2408
2409 for (
j=1;
j<nRing;
j++)
2410 {
2411 gcd_tmp =
gcd(gcd_tmp, (*curr_weight)[
j]);
2412 if(gcd_tmp == 1)
2413 {
2414 break;
2415 }
2416 }
2417 if(gcd_tmp != 1)
2418 {
2419 for (
j=0;
j<nRing;
j++)
2420 {
2421 gcd_tmp =
gcd(gcd_tmp, (*diff_weight)[
j]);
2422 if(gcd_tmp == 1)
2423 {
2424 break;
2425 }
2426 }
2427 }
2428 if(gcd_tmp != 1)
2429 {
2430 for (
j=0;
j<nRing;
j++)
2431 {
2432 (*curr_weight)[
j] = (*curr_weight)[
j]/gcd_tmp;
2433 (*diff_weight)[
j] = (*diff_weight)[
j]/gcd_tmp;
2434 }
2435 }
2436
2437#ifdef NEXT_VECTORS_CC
2438 Print(
"\n// gcd of the weight vectors (current and target) = %d", gcd_tmp);
2441
2442 PrintS(
"\n// t_zaehler: "); mpz_out_str( stdout, 10, t_zaehler);
2443 PrintS(
", t_nenner: "); mpz_out_str( stdout, 10, t_nenner);
2444#endif
2445
2446
2447
2448
2449
2450
2451 for (
j=0;
j<nRing;
j++)
2452 {
2453 mpz_set_si(dcw, (*curr_weight)[
j]);
2454 mpz_mul(s_nenner, t_nenner, dcw);
2455
2456 if( (*diff_weight)[
j]>0)
2457 {
2458 mpz_mul_ui(s_zaehler, t_zaehler, (*diff_weight)[
j]);
2459 }
2460 else
2461 {
2462 mpz_mul_ui(s_zaehler, t_zaehler, -(*diff_weight)[
j]);
2463 mpz_neg(s_zaehler, s_zaehler);
2464 }
2465 mpz_add(sntz, s_nenner, s_zaehler);
2466 mpz_init_set(
vec[
j], sntz);
2467
2468#ifdef NEXT_VECTORS_CC
2469 Print(
"\n// j = %d ==> ",
j);
2471 mpz_out_str( stdout, 10, t_nenner);
2472 Print(
" * %d)", (*curr_weight)[
j]);
2473 PrintS(
" + ("); mpz_out_str( stdout, 10, t_zaehler);
2474 Print(
" * %d) = ", (*diff_weight)[
j]);
2475 mpz_out_str( stdout, 10, s_nenner);
2477 mpz_out_str( stdout, 10, s_zaehler);
2478 PrintS(
" = "); mpz_out_str( stdout, 10, sntz);
2479 Print(
" ==> vector[%d]: ",
j); mpz_out_str(stdout, 10,
vec[
j]);
2480#endif
2481
2483 {
2484 mpz_set(ggt, sntz);
2485 }
2486 else
2487 {
2488 if(mpz_cmp_si(ggt,1) != 0)
2489 {
2490 mpz_gcd(ggt, ggt, sntz);
2491 }
2492 }
2493 }
2494
2495 if(mpz_cmp_si(ggt,1) != 0)
2496 {
2497 for (
j=0;
j<nRing;
j++)
2498 {
2500 }
2501 }
2502#ifdef NEXT_VECTORS_CC
2503 PrintS(
"\n// gcd of elements of the vector: ");
2504 mpz_out_str( stdout, 10, ggt);
2505#endif
2506
2507 for (
j=0;
j<nRing;
j++)
2508 {
2509 (*diff_weight)[
j] = mpz_get_si(
vec[
j]);
2510 }
2511
2512
2513
2514 for (
j=0;
j<nRing;
j++)
2515 {
2516 if(mpz_cmp(
vec[
j], sing_int)>=0)
2517 {
2519 {
2521 PrintS(
"\n// ** OVERFLOW in \"MwalkNextWeightCC\": ");
2522 mpz_out_str( stdout, 10,
vec[
j]);
2523 PrintS(
" is greater than 2147483647 (max. integer representation)\n");
2524
2525 }
2526 }
2527 }
2528
2529 FINISH:
2530 delete diff_weight1;
2531 mpz_clear(t_zaehler);
2532 mpz_clear(t_nenner);
2533 mpz_clear(s_zaehler);
2534 mpz_clear(s_nenner);
2535 mpz_clear(sntz);
2536 mpz_clear(sztn);
2537 mpz_clear(temp);
2538 mpz_clear(MwWd);
2539 mpz_clear(deg_w0_p1);
2540 mpz_clear(deg_d0_p1);
2541 mpz_clear(ggt);
2543 mpz_clear(sing_int_half);
2544 mpz_clear(sing_int);
2545 mpz_clear(dcw);
2546 mpz_clear(t_null);
2547
2549 {
2551 }
2554 {
2557 {
2560 }
2561 }
2562return diff_weight;
2563}
intvec * ivCopy(const intvec *o)
static int MivAbsMaxArg(intvec *vec)
static void cancel(mpz_t zaehler, mpz_t nenner)
static intvec * MExpPol(poly f)
static intvec * MivSub(intvec *a, intvec *b)
static long MivDotProduct(intvec *a, intvec *b)