Schrijf een stijgende reeks van natuurlijke getallen op een blaadje papier. Deze reeks mag dubbels bevatten. Beschouw bij wijze van voorbeeld de volgende reeks priemgetallen:

2, 3, 5, 7, 11, 13

Noem deze stijgende reeks van natuurlijke getallen $$p_n$$ en noem het grootste natuurlijk getal van de reeks $$m$$. We definiëren nu de frequentiereeks van $$p_n$$ als de reeks van $$m + 1$$ natuurlijke getallen die aangeven hoeveel getallen van $$p_n$$ kleiner zijn dan 1, hoeveel er kleiner zijn dan 2, enzoverder. De frequentiereeks van bovenstaande reeks priemgetallen is dan

0, 0, 1, 2, 2, 3, 3, 4, 4, 4, 4, 5, 5, 6

Vreemd genoeg is de frequentiereeks van de frequentiereeks van $$p_n$$ altijd gelijk aan $$p_n$$ (op één extra getal $$m + 1$$ op het einde na). Als we bijvoorbeeld de frequentiereeks van bovenstaande frequentiereeks bepalen, dan krijgen we opnieuw de reeks

2, 3, 5, 7, 11, 13, 14

Verhoog nu de getallen in elk van deze twee reeksen overeenkomstig hun positie in de reeks — dat is: tel 1 op bij het eerste element van elke reeks, 2 bij het tweede element, enzoverder. Dit resulteert in de volgende twee stijgende reeksen van natuurlijke getallen.

3, 5, 8, 11, 16, 19
1, 2, 4, 6, 7, 9, 10, 12, 13, 14, 15, 17, 18, 20

Deze twee reeksen zullen altijd complementair zijn — alle strikt positieve natuurlijke getallen komen voor, maar ze zijn opgesplitst over de twee reeksen, zonder dubbels.

Opgave

Implementeer deze vier functies waaraan telkens een reeks (list of tuple) van natuurlijke getallen (int) moet doorgegeven worden:

Voorbeeld

>>> isstijgend([2, 3, 5, 7, 11, 13])
True
>>> isstijgend((0, 0, 1, 2, 2, 3, 3, 4, 4, 4, 4, 5, 5, 6))
True
>>> isstijgend([5, 3, 2, 7, 8, 1, 9])
False

>>> frequentiereeks([2, 3, 5, 7, 11, 13])
[0, 0, 1, 2, 2, 3, 3, 4, 4, 4, 4, 5, 5, 6]
>>> frequentiereeks((0, 0, 1, 2, 2, 3, 3, 4, 4, 4, 4, 5, 5, 6))
[2, 3, 5, 7, 11, 13, 14]
>>> frequentiereeks([5, 3, 2, 7, 8, 1, 9])
Traceback (most recent call last):
AssertionError: gegeven reeks is niet stijgend

>>> verhogen([2, 3, 5, 7, 11, 13])
[3, 5, 8, 11, 16, 19]
>>> verhogen((0, 0, 1, 2, 2, 3, 3, 4, 4, 4, 4, 5, 5, 6))
[1, 2, 4, 6, 7, 9, 10, 12, 13, 14, 15, 17, 18, 20]
>>> verhogen([5, 3, 2, 7, 8, 1, 9])
[6, 5, 5, 11, 13, 7, 16]

>>> complementaire_reeksen([2, 3, 5, 7, 11, 13])
([3, 5, 8, 11, 16, 19], [1, 2, 4, 6, 7, 9, 10, 12, 13, 14, 15, 17, 18, 20])
>>> complementaire_reeksen((1, 3, 3, 5, 5, 5, 7, 7, 7, 7))
([2, 5, 6, 9, 10, 11, 14, 15, 16, 17], [1, 3, 4, 7, 8, 12, 13, 18])
>>> complementaire_reeksen([5, 3, 2, 7, 8, 1, 9])
Traceback (most recent call last):
AssertionError: gegeven reeks is niet stijgend

Bronnen