# а) Осуществить моделирование n = 1000 реализаций БСВ с помощью мультипликативного
# конгруэнтного метода (МКМ) с параметрами a 0 = a 01 , β = max{c 1 , M – c 1 },
# M = 2 31 и вывести 100-ый, 900-ый и 1000-ый элементы сгенерированной последовательности.
# б) Осуществить моделирование n = 1000 реализаций БСВ с помощью метода
# Макларена-Марсальи, используя в качестве простейших датчиков БСВ датчики D 1 –
# датчик из первого задания, D 2 – датчик по методу МКМ с параметрами a 0 = a 02 ,
# β = max{c 2 , M – c 2 }, M = 2 31 , K – объем вспомогательной таблицы и вывести
# 100-ый, 900-ый и 1000-ый элементы сгенерированной последовательности.

from typing import List


def mpcm(n: int, a0: int, b: int, M: int):
    a = a0
    for i in range(n):
        a = (b * a) % M
        yield a / M


def mcl_mrsl(n: int, b: List[int], c: List[int], k: int):
    v = b[:k]
    for i in range(n):
        s = int(c[i] * k)
        yield v[s]
        v[s] = b[i + k]


# variant 16
if __name__ == '__main__':
    M = 2 ** 31
    a01 = 80202397
    c1 = 264561431
    b1 = max(c1, M - c1)
    a02 = 289809159
    c2 = 90281719
    b2 = max(c2, M - c2)
    K = 128
    n = 1000
    test01 = list(mpcm(n + K, a01, b1, M))
    test02 = list(mpcm(n + K, a02, b2, M))
    test2 = list(mcl_mrsl(n, test01, test02, K))
    print(test01[0], test01[14])
    print(test2[0], test2[14])
