/* Copyright (C) 2020 Daniel Schultz This file is part of FLINT. FLINT is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License (LGPL) as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. See . */ #include #include "fmpz_mpoly_factor.h" typedef struct { slong idx; fmpz exp; const fmpz_mpoly_struct * polys; const fmpz_mpoly_ctx_struct * ctx; } sort_struct; static int _sort(const void * a_, const void * b_) { int cmp; const sort_struct * a = (const sort_struct *) a_; const sort_struct * b = (const sort_struct *) b_; const fmpz_mpoly_struct * apoly = a->polys + a->idx; const fmpz_mpoly_struct * bpoly = b->polys + b->idx; cmp = fmpz_cmp(&a->exp, &b->exp); if (cmp != 0) return cmp; return fmpz_mpoly_cmp(apoly, bpoly, a->ctx); } void fmpz_mpoly_factor_sort( fmpz_mpoly_factor_t f, const fmpz_mpoly_ctx_t ctx) { slong i; sort_struct * data; fmpz_mpoly_struct * fc; if (f->num < 1) return; data = (sort_struct *) flint_malloc(f->num*sizeof(sort_struct)); for (i = 0; i < f->num; i++) { data[i].idx = i; data[i].exp = f->exp[i]; data[i].polys = f->poly; data[i].ctx = ctx; } qsort(data, f->num, sizeof(sort_struct), _sort); /* we will not permute in place */ fc = (fmpz_mpoly_struct *) flint_malloc(f->num*sizeof(fmpz_mpoly_struct)); memcpy(fc, f->poly, f->num*sizeof(fmpz_mpoly_struct)); for (i = 0; i < f->num; i++) { f->exp[i] = data[i].exp; f->poly[i] = fc[data[i].idx]; } flint_free(fc); flint_free(data); }