public static PermutationBuilder GetCyclicPermsListIRS64(int t, BitmapFromList64 bb = null) { return delegate (IList<int> perm) { var P = new CyclicPerms_MRRR (); P.Build (perm, t, ListIBuilders.GetListIRS64(bb), ListIBuilders.GetListIFS()); return P; }; }
public static SequenceBuilder GetSeqXLB(short t, BitmapFromList64 bitmap_builder) { return delegate (IList<int> seq, int sigma) { var seqxl = new SeqXLB (); seqxl.Build (seq, sigma, t, bitmap_builder); return seqxl; }; }
public void Build(IList<int> seq, int sigma, int t = 16, BitmapFromList64 bitmap_builder = null) { this.sigma = sigma; long n = seq.Count; var L = new long[n]; var counters = new int[sigma + 1]; // counters.Add (0, sigma); <- if ListIFS for (int i = 0; i < n; ++i) { var sym = seq [i]; try { counters [sym + 1] += 1; } catch (Exception e) { Console.WriteLine ("===== sigma: {0}, sym: {1}, i: {2}, n: {3}", sigma, sym, i, n); throw e; } } for (int i = 1; i <= sigma; ++i) { counters [i] += counters [i - 1]; } for (int i = 0; i < n; ++i) { var sym = seq [i]; long long_sym = n * ((long)sym) + i; L [counters [sym]] = long_sym; counters [sym] += 1; } counters = null; /**** slow construction ****/ /***** for (int i = 0; i < n; ++i) { long s = seq [i]; L [i] = n * s + i; //L.Add (n * s + i); } Array.Sort (L); *****/ if (bitmap_builder == null) { bitmap_builder = BitmapBuilders.GetSArray64 (); } this.xl_bitmap = bitmap_builder (L, n * sigma); // now building the permutation for access var p = new ListGen_MRRR (); p.Build (this.GetNotIdxPERM (), t, null); this.perm = p; }