/* Copyright (C) 2003 David Bateman 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; either version 2, or (at your option) any later version. 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 Octave; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. In addition to the terms of the GPL, you are permitted to link this program with any Open Source program, as defined by the Open Source Initiative (www.opensource.org) */ #include #include #include #include #include enum primpoly_type { PRIMPOLY_MIN=0, PRIMPOLY_MAX, PRIMPOLY_ALL, PRIMPOLY_K }; static bool do_isprimitive (const int& a, const int& m) { // Fast return since primitive polynomial can't be even if (!(a & 1)) return false; RowVector repr(1< 3) { error ("primpoly: wrong number of arguments"); return retval; } m = args(0).int_value(); // The upper limit is an artifical limit caused by memory requirements // in do_is_primitive. m=22 uses an array of 32MBytes!! if ((m < 1) || (m > 22)) { error("primpoly: m must be greater than 1 and less than 22"); return retval; } if (nargin > 1) { if (args(1).is_scalar_type ()) { k = args(1).int_value(); type = PRIMPOLY_K; } else if (args(1).is_string ()) { std::string s_arg = args(1).string_value (); if (s_arg == "nodisplay") disp = false; else if (s_arg == "min") type = PRIMPOLY_MIN; else if (s_arg == "max") type = PRIMPOLY_MAX; else if (s_arg == "all") type = PRIMPOLY_ALL; else { error ("primpoly: invalid argument"); return retval; } } else { error ("primpoly: incorrect argument type"); return retval; } } if (nargin > 2) { if (args(2).is_scalar_type ()) { if (type == PRIMPOLY_K) { error ("primpoly: invalid arguments"); return retval; } k = args(2).int_value(); type = PRIMPOLY_K; } else if (args(2).is_string ()) { std::string s_arg = args(2).string_value (); if (s_arg == "nodisplay") { if (!disp) { error ("primpoly: invalid arguments"); return retval; } disp = false; } else if (!disp) { if (s_arg == "min") type = PRIMPOLY_MIN; else if (s_arg == "max") type = PRIMPOLY_MAX; else if (s_arg == "all") type = PRIMPOLY_ALL; else { error ("primpoly: invalid argument"); return retval; } } else { error ("primpoly: invalid arguments"); return retval; } } else { error ("primpoly: incorrect argument type"); return retval; } } switch (type) { case PRIMPOLY_MIN: primpolys.resize(1); for (int i = (1< (1<