Changeset 5600a4 in git for Singular/LIB/modular.lib


Ignore:
Timestamp:
Sep 7, 2016, 6:16:24 PM (8 years ago)
Author:
Hans Schoenemann <hannes@…>
Branches:
(u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
Children:
e4ac9d386d815e4411fb4fcea3826b2c8d70fd37
Parents:
78321f7f1ef646d795a532545c8159f388de4136a88bbe6011f0f3b0eec150334d2c6243aa1f57ad
git-author:
Hans Schoenemann <hannes@mathematik.uni-kl.de>2016-09-07 18:16:24+02:00
git-committer:
GitHub <noreply@github.com>2016-09-07 18:16:24+02:00
Message:
Merge pull request #784 from steenpass/modular

chg: update modular.lib
File:
1 edited

Legend:

Unmodified
Added
Removed
  • Singular/LIB/modular.lib

    r78321f r5600a4  
    4040";
    4141
     42LIB "general.lib";
    4243LIB "resources.lib";
    4344LIB "tasks.lib";
     
    157158        // delete unlucky primes
    158159        indices = deleteUnluckyPrimes(modresults);
     160        indices = sort(indices)[1];
     161        for (i = size(indices); i > 1; i--) {
     162            if (indices[i] == indices[i-1]) {
     163                indices = delete(indices, i);
     164            }
     165        }
    159166        for (i = size(indices); i > 0; i--) {
    160167            modresults = delete(modresults, indices[i]);
     
    164171        // lift result
    165172        if (N == 1) {
    166             result_lift = chinrem(modresults, primes);
     173            result_lift = chinrem_recursive(modresults, primes);
    167174        }
    168175        else {
    169             result_lift = chinrem(list(result_lift)+modresults,
     176            result_lift = chinrem_recursive(list(result_lift)+modresults,
    170177                list(N)+primes);
    171178        }
     
    211218    ideal I = x9y2+x10, x2y7-y8;
    212219    modular("std", list(I));
     220}
     221
     222static proc chinrem_recursive(list modresults, list moduli)
     223{
     224    if (typeof(modresults[1]) != "list") {
     225        return(chinrem(modresults, moduli));
     226    }
     227    // if typeof(modresults[1]) == "list", then we assume
     228    // size(modresults[1]) == size(modresults[k])
     229    // for k = 2, ..., size(modresults)
     230    int n_sublists = size(modresults[1]);
     231    int i, j;
     232    list modresults_sublists;
     233    for (j = n_sublists; j > 0; j--) {
     234        modresults_sublists[j] = list();
     235        for (i = size(modresults); i > 0; i--) {
     236            modresults_sublists[j][i] = modresults[i][j];
     237        }
     238        task t(j) = "Modular::chinrem_recursive",
     239            list(modresults_sublists[j], moduli);
     240    }
     241    startTasks(t(1..n_sublists));
     242    waitAllTasks(t(1..n_sublists));
     243    list result;
     244    for (j = n_sublists; j > 0; j--) {
     245        result[j] = getResult(t(j));
     246        killTask(t(j));
     247    }
     248    return(result);
    213249}
    214250
     
    290326{
    291327    arg_type = typeof(farey_arg);
    292     if (arg_type != "bigint" && arg_type != "ideal"
    293         && arg_type != "module" && arg_type != "matrix") {
     328    if (arg_type != "bigint" && arg_type != "ideal" && arg_type != "module"
     329        && arg_type != "matrix" && arg_type != "list") {
    294330        ERROR("wrong input type");
     331    }
     332    int i;
     333    if (arg_type == "list") {
     334        int size_farey_arg = size(farey_arg);
     335        for (i = size_farey_arg; i > 0; i--) {
     336            task t(i) = "Modular::farey_parallel", list(farey_arg[i], farey_N);
     337        }
     338        startTasks(t(1..size_farey_arg));
     339        waitAllTasks(t(1..size_farey_arg));
     340        list result;
     341        for (i = size_farey_arg; i > 0; i--) {
     342            result[i] = getResult(t(i));
     343            killTask(t(i));
     344        }
     345        return(result);
    295346    }
    296347    if (arg_type == "bigint" || arg_type == "matrix") {
     
    302353    int chunks = par_range(size_arg);
    303354    intvec range;
    304     int i;
    305355    for (i = chunks; i > 0; i--) {
    306356        range = par_range(size_arg, i);
Note: See TracChangeset for help on using the changeset viewer.