File: recursive_sequences.gel

package info (click to toggle)
genius 1.0.27-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 25,308 kB
  • sloc: ansic: 75,620; xml: 71,565; sh: 4,445; makefile: 1,927; lex: 523; yacc: 298; perl: 54
file content (36 lines) | stat: -rw-r--r-- 1,370 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# Compute linear recursive sequences using Galois stepping (I think --
# or maybe I have it backwards)
# FIXME: Check names for this stuff!

# Galois Matrix
# Given a linear combining rule (a_1*x_+...+a_n*x_n=x_(n+1)),
# gives the Galois stepping matrix
SetHelp ("GaloisMatrix", "combinatorics", "Galois matrix given a linear combining rule (a_1*x_1+...+a_n*x_n=x_(n+1))")
function GaloisMatrix(combining_rule) = (
 [[0;I(columns(combining_rule)-1)],combining_rule.']
)

# Linear recursive sequence
SetHelp ("LinearRecursiveSequence", "combinatorics", "Compute linear recursive sequence using Galois stepping")
function LinearRecursiveSequence(seed_values,combining_rule,n) =
(
 if IsNull(n) then return null;
 if IsMatrix(n) then (
  for j=1 to elements(n) do (
   n@(j) = LinearRecursiveSequence(seed_values,combining_rule,n@(j))
  );
  return n
 );
 k=columns(seed_values);
 if (k > n >= 0) then                      # If asks for one of the seed values, return it
   seed_values@(n+1)
 else                                      # otherwise...
 (
  G=GaloisMatrix(combining_rule);         # form the Galois matrix
  if (n >= k) then
   (seed_values*G^(n-k+1))@(k)       # ...and step it enough times
  else if (IsInvertible(G)) then
   (seed_values*G^n)@(1)             # ...or step it backwards
  else null                         # (if sequence is reversible)
 )
)