packages feed

Flint2-0.1.0.0: csrc/perm/order.c

#include "../perm.h"

void _perm_order(fmpz_t order, slong *x, slong n) {

  slong *m = _perm_init(n);
  slong k, l, mark = 0;
  
  int found;

  fmpz_t tmp;
  
  fmpz_init(tmp);
  fmpz_set_ui(order, 1);
  
  do {
    found = 0;
    for(slong j=0; j<n; j++) {
      if( m[j] < 0 ) {
      } else {
	// found unmarked
	found = 1;
	mark--;
	k = j;
	l = 0;
	do {
	  m[k] = mark;
	  k = x[k];
	  l++;
	} while ( m[k] >= 0 );
	fmpz_set_si(tmp, l);
	fmpz_lcm(order, order, tmp);
      }
    } 
  } while( found );
  
  fmpz_clear(tmp);
  _perm_clear(m);
}