# Streams or Infinite Arrays¶

This code is based on the work of Ralf Hemmecke and Martin Rubey’s Aldor-Combinat, which can be found at http://www.risc.uni-linz.ac.at/people/hemmecke/aldor/combinat/index.html. In particular, the relevant section for this file can be found at http://www.risc.uni-linz.ac.at/people/hemmecke/AldorCombinat/combinatse12.html.

sage.combinat.species.stream.Stream(x=None, const=None)

Returns a stream.

EXAMPLES: We can create a constant stream by just passing a

sage: from sage.combinat.species.stream import Stream
sage: s = Stream(const=0)
sage: [s[i] for i in range(10)]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

class sage.combinat.species.stream.Stream_class(gen=None, const=None, func=None)

EXAMPLES:

sage: from sage.combinat.species.stream import Stream
sage: from builtins import zip
sage: s = Stream(const=0)
sage: len(s)
1
sage: [x for (x,i) in zip(s, range(4))]
[0, 0, 0, 0]
sage: len(s)
1

sage: s = Stream(const=4)
sage: g = iter(s)
sage: l1 = [x for (x,i) in zip(g, range(10))]
sage: l = [4 for k in range(10)]
sage: l == l1
True

sage: h = lambda l: 1 if len(l) < 2 else l[-1] + l[-2]
sage: fib = Stream(h)
sage: [x for (x,i) in zip(fib, range(11))]
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

sage: r = [4, 3, 5, 2, 6, 1, 1, 1, 1, 1]
sage: l = [4, 3, 5, 2, 6, 1]
sage: s = Stream(l)
sage: s[3] = -1
sage: [x for (x,i) in zip(s, r)]
[4, 3, 5, -1, 6, 1, 1, 1, 1, 1]
sage: s[5] = -2
sage: [x for (x,i) in zip(s, r)]
[4, 3, 5, -1, 6, -2, 1, 1, 1, 1]
sage: s[6] = -3
sage: [x for (x,i) in zip(s, r)]
[4, 3, 5, -1, 6, -2, -3, 1, 1, 1]
sage: s[8] = -4
sage: [x for (x,i) in zip(s, r)]
[4, 3, 5, -1, 6, -2, -3, 1, -4, 1]
sage: a = Stream(const=0)
sage: a[2] = 3
sage: [x for (x,i) in zip(a, range(4))]
[0, 0, 3, 0]

data()

Returns a list of all the coefficients computed so far.

EXAMPLES:

sage: from sage.combinat.species.stream import Stream, _integers_from
sage: s = Stream(_integers_from(3))
sage: s.data()
[]
sage: s[5]
8
sage: s.data()
[3, 4, 5, 6, 7, 8]

is_constant()

Returns True if and only if

EXAMPLES:

sage: from sage.combinat.species.stream import Stream
sage: s = Stream([1,2,3])
sage: s.is_constant()
False
sage: s[3]
3
sage: s.data()
[1, 2, 3]
sage: s.is_constant()
True

sage: s = Stream(const='I am constant.')
sage: s.is_constant()
True

map(f)

EXAMPLES:

sage: from sage.combinat.species.stream import Stream
sage: s = Stream(ZZ)
sage: square = lambda x: x^2
sage: ss = s.map(square)
sage: [ss[i] for i in range(10)]
[0, 1, 1, 4, 4, 9, 9, 16, 16, 25]

sage: double = lambda z: 2*z
sage: o = Stream([0,1,2,3])
sage: [x for (x,i) in zip(o, range(6))]
[0, 1, 2, 3, 3, 3]
sage: t = o.map(double)
sage: [x for (x,i) in zip(t, range(6))]
[0, 2, 4, 6, 6, 6]

number_computed()

Returns the number of coefficients computed so far.

EXAMPLES:

sage: from sage.combinat.species.stream import Stream
sage: l = [4,3,5,7,4,1,9,7]
sage: s = Stream(l)
sage: s[3]
7
sage: len(s)
4
sage: s[3]
7
sage: len(s)
4
sage: s[1]
3
sage: len(s)
4
sage: s[4]
4
sage: len(s)
5

set_gen(gen)

EXAMPLES:

sage: from sage.combinat.species.stream import Stream
sage: from builtins import zip
sage: fib = Stream()
sage: def g():
....:        yield 1
....:        yield 1
....:        n = 0
....:        while True:
....:            yield fib[n] + fib[n+1]
....:            n += 1

sage: fib.set_gen(g())
sage: [x for (x,i) in zip(fib, range(11))]
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

sage: l = [4,3,5,2,6,1]
sage: s = Stream(l)
sage: s[3]
2
sage: len(s)
4
sage: g = iter(l)
sage: s.set_gen(g)
sage: s[5]
3
sage: len(s)
6

stretch(k)

EXAMPLES:

sage: from sage.combinat.species.stream import Stream
sage: s = Stream(range(1, 10))
sage: s2 = s.stretch(2)
sage: [s2[i] for i in range(10)]
[1, 0, 2, 0, 3, 0, 4, 0, 5, 0]