{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "d74e7711-ed1a-4749-8827-2e6fa5798d68",
   "metadata": {},
   "outputs": [],
   "source": [
    "def lcg (a,c,m, startwert):\n",
    "\n",
    "    if a<=0 or c<0 or m<=0 or startwert <0:\n",
    "        return None #prüfung der werte \n",
    "    \n",
    "    x = startwert \n",
    "    while 1:\n",
    "        x=(a*x+c)%m\n",
    "        yield x "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "2993ac89-2be8-4c61-a6e2-43a1008f2d36",
   "metadata": {},
   "outputs": [],
   "source": [
    "def lcg_test(seed: int, scalar: int, modulus: int, offset: int) -> int:\n",
    "    assert modulus > 0, \"Modulus must be greater than 0\"\n",
    "    assert 0 <= scalar and scalar < modulus, \"Scalar must be in range 0 <= a < m\"\n",
    "\n",
    "    while seed > 1:\n",
    "        seed = (scalar*seed+offset) % modulus\n",
    "        assert seed >= 0\n",
    "        yield seed"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "02a21a6d-0892-44f0-b0fd-6e5f8fe83962",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Lcg using Cocktailshaker Numbers: 3089810780120156248\n",
      "Correct should be: 3089810780120156248\n",
      "\n",
      "Lcg using Cocktailshaker Numbers: 8356396685252565260\n",
      "Correct should be: 8356396685252565260\n",
      "\n",
      "Lcg using Cocktailshaker Numbers: 1921117399837525548\n",
      "Correct should be: 1921117399837525548\n",
      "\n",
      "Lcg using Cocktailshaker Numbers: 14806858147081821235\n",
      "Correct should be: 14806858147081821235\n",
      "\n",
      "Lcg using Cocktailshaker Numbers: 2557599628047639428\n",
      "Correct should be: 2557599628047639428\n",
      "\n",
      "Lcg using Cocktailshaker Numbers: 16453652254840064460\n",
      "Correct should be: 16453652254840064460\n",
      "\n",
      "Lcg using Cocktailshaker Numbers: 15995401842808378843\n",
      "Correct should be: 15995401842808378843\n",
      "\n",
      "Lcg using Cocktailshaker Numbers: 681272290641816305\n",
      "Correct should be: 681272290641816305\n",
      "\n",
      "Lcg using Cocktailshaker Numbers: 10955466795170118648\n",
      "Correct should be: 10955466795170118648\n",
      "\n",
      "Lcg using Cocktailshaker Numbers: 13714992071537968180\n",
      "Correct should be: 13714992071537968180\n",
      "\n"
     ]
    }
   ],
   "source": [
    "s = lcg(3203021881815356449, 11742185885288659963, 2**64-1, 3935559000370003845)\n",
    "t = lcg_test(3935559000370003845, 3203021881815356449, 2**64-1, 11742185885288659963)\n",
    "\n",
    "for _ in range(10):\n",
    "    stud = next(s)\n",
    "    instructor = next(t)\n",
    "    print(\"Lcg using Cocktailshaker Numbers:\", stud)\n",
    "    print(\"Correct should be:\", instructor, end='\\n\\n')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "40aeb297-aeb5-4fca-8ae4-cb84c7f13957",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
