{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "b9be1f08",
   "metadata": {},
   "source": [
    "# Nombres de Bernoulli\n",
    "\n",
    "Marc Lorenzi\n",
    "\n",
    "29 mars 2026"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c4b4d4e8",
   "metadata": {},
   "outputs": [],
   "source": [
    "from fractions import Fraction"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b49ab919",
   "metadata": {},
   "source": [
    "## Calculer les nombres de Bernoulli"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a3e7c984",
   "metadata": {},
   "source": [
    "La suite $(b_n)_{n\\in\\mathbb N}$ des *nombres de Bernoulli* vérifie $b_0=1$ et pour tout $n\\ge 1$,\n",
    "\n",
    "$$b_n=-\\frac 1{n+1}\\sum_{k=0}^{n-1}\\binom{n+1}kb_k$$"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "443d20d1",
   "metadata": {},
   "source": [
    "La fonction `step_binoms` prend en paramètre une ligne du triangle de Pascal, c'est à dire une liste $[\\binom n0,\\binom n1,\\ldots,\\binom n n]$ où $n\\in\\mathbb N$. Elle renvoie la liste $[\\binom {n+1}0,\\binom {n+1}1,\\ldots,\\binom {n+1}{n+1}]$. Sa complexité, en nombre d'opérations arithmétiques, est $O(n)$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e839bda4",
   "metadata": {},
   "outputs": [],
   "source": [
    "def step_binom(binoms):\n",
    "    n = len(binoms)\n",
    "    binoms1 = [1]\n",
    "    for k in range(1, n):\n",
    "        binoms1.append(binoms[k - 1] + binoms[k])\n",
    "    binoms1.append(1)\n",
    "    return binoms1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "eb54e49d",
   "metadata": {},
   "outputs": [],
   "source": [
    "binoms = [1]\n",
    "for n in range(10):\n",
    "    binoms = step_binom(binoms)\n",
    "    print(binoms)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8cf99f16",
   "metadata": {},
   "source": [
    "La fonction `bernoulli` renvoie la liste $[b_0,b_1,\\ldots,b_{N}]$. Sa complexité, en nombre d'opérations arithmétiques, est $O(N^2)$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6eba04db",
   "metadata": {},
   "outputs": [],
   "source": [
    "def bernoulli(N):\n",
    "    bs = [Fraction(1)]\n",
    "    binoms = [1, 2, 1]\n",
    "    for n in range(1, N + 1):\n",
    "        s = 0\n",
    "        for k in range(n):\n",
    "            s = s + bs[k] * binoms[k]\n",
    "        bs.append(-s / (n + 1))\n",
    "        binoms = step_binom(binoms)\n",
    "    return bs"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bf683a15",
   "metadata": {},
   "source": [
    "Voici les $b_n$ pour $0\\le n\\le 20$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "7dbe4f67",
   "metadata": {},
   "outputs": [],
   "source": [
    "n = 20\n",
    "bs = bernoulli(n)\n",
    "for k in range(n + 1):\n",
    "    print('%4d%20s' % (k, bs[k]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d8dcc5df",
   "metadata": {},
   "outputs": [],
   "source": [
    "B = bernoulli(200)[-1]\n",
    "print(B)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "62e38b75",
   "metadata": {},
   "source": [
    "## Le développement limité en 0 de la fonction tangente"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2dbac48e",
   "metadata": {},
   "source": [
    "Le développement limité de $\\tan$ à l'ordre $2n$ en 0 est\n",
    "\n",
    "$$\\tan x =\\sum_{k=1}^na_{2k-1}x^{2k-1}+o(x^{2n})$$\n",
    "\n",
    "où\n",
    "\n",
    "$$a_{2k-1}=(-1)^{k-1}\\frac{2^{2k}(2^{2k}-1)}{(2k)!}b_{2k}$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0ecd2425",
   "metadata": {},
   "outputs": [],
   "source": [
    "def fact(n):\n",
    "    p = 1\n",
    "    for k in range(1, n + 1):\n",
    "        p = p * k\n",
    "    return p"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f7be0e52",
   "metadata": {},
   "source": [
    "Voici les $a_{2k-1}$ pour $1\\le k\\le 20$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8ecab766",
   "metadata": {},
   "outputs": [],
   "source": [
    "n = 20\n",
    "bs = bernoulli(2 * n)\n",
    "cs = [Fraction((-1) ** (k - 1) * 2 ** (2 * k) * bs[2 * k] * (2 ** (2 * k) - 1),fact(2 * k)) for k in range(1, n + 1)]\n",
    "for k in range(n):\n",
    "    print(2 * k + 1, cs[k])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "7fa555ca",
   "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.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
