X-Git-Url: https://git.distorted.org.uk/u/mdw/catacomb/blobdiff_plain/fcdaa1806c38c703a6e72b87e189396a05d165e4..908ebb29ff621f582b34d48fd4278b60b78379b6:/prim.c diff --git a/prim.c b/prim.c index bdad98b..4767912 100644 --- a/prim.c +++ b/prim.c @@ -1,13 +1,13 @@ /* -*-c-*- * - * $Id: prim.c,v 1.1 1999/12/22 15:58:59 mdw Exp $ + * $Id: prim.c,v 1.4 2004/04/08 01:36:15 mdw Exp $ * * Finding primitive elements * * (c) 1999 Straylight/Edgeware */ -/*----- Licensing notice --------------------------------------------------* +/*----- Licensing notice --------------------------------------------------* * * This file is part of Catacomb. * @@ -15,26 +15,18 @@ * it under the terms of the GNU Library General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. - * + * * Catacomb is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. - * + * * You should have received a copy of the GNU Library General Public * License along with Catacomb; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, * MA 02111-1307, USA. */ -/*----- Revision history --------------------------------------------------* - * - * $Log: prim.c,v $ - * Revision 1.1 1999/12/22 15:58:59 mdw - * Search for primitive elements using prime-search equipment. - * - */ - /*----- Header files ------------------------------------------------------*/ #include "mp.h" @@ -57,27 +49,37 @@ int prim_test(int rq, pgen_event *ev, void *p) case PGEN_BEGIN: return (PGEN_TRY); case PGEN_TRY: { - mp *x = MP_NEW; - mp *f = c->f; + mp *x; rc = PGEN_FAIL; - x = mpmont_exp(&c->mm, x, ev->m, f); - if (MP_CMP(x, ==, MP_ONE)) - goto done; - if (c->n == 0) { - mp_drop(ev->m); - ev->m = MP_COPY(x); - } else { - size_t n = c->n - 1; - f++; + if (!c->exp) + x = mp_copy(ev->m); + else { + x = mpmont_exp(&c->mm, MP_NEW, ev->m, c->exp); + if (MP_EQ(x, MP_ONE)) + goto done; + } + if (c->n == 0) + goto ok; + else { + size_t n = c->n; + mp **f = c->f; + mp *y = MP_NEW; while (n) { - x = mpmont_exp(&c->mm, x, ev->m, f); - if (MP_CMP(x, ==, MP_ONE)) + y = mpmont_exp(&c->mm, y, x, *f); + if (MP_EQ(y, MP_ONE)) { + mp_drop(y); goto done; + } n--; f++; } + mp_drop(y); } + ok: rc = PGEN_DONE; + mp_drop(ev->m); + ev->m = x; + break; done: mp_drop(x); } break;