/* * This file is part of the BSGS distribution (https://github.com/JeanLucPons/BSGS). * Copyright (c) 2020 Jean Luc PONS. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, version 3. * * This program 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 * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "IntGroup.h" using namespace std; IntGroup::IntGroup(int size) { this->size = size; subp = (Int *)malloc(size * sizeof(Int)); } IntGroup::~IntGroup() { free(subp); } void IntGroup::Set(Int *pts) { ints = pts; } // Compute modular inversion of the whole group void IntGroup::ModInv() { Int newValue; Int inverse; subp[0].Set(&ints[0]); for (int i = 1; i < size; i++) { subp[i].ModMulK1(&subp[i - 1], &ints[i]); } // Do the inversion inverse.Set(&subp[size - 1]); inverse.ModInv(); for (int i = size - 1; i > 0; i--) { newValue.ModMulK1(&subp[i - 1], &inverse); inverse.ModMulK1(&ints[i]); ints[i].Set(&newValue); } ints[0].Set(&inverse); }