{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "def gauss(M):\n", " A=copy(M)\n", " n=A.nrows()\n", " for j in range(n):\n", " # Recherche du pivot\n", " if A[j,j]==0:\n", " for i in range(j+1,n):\n", " if A[i,j]!=0:\n", " A.swap_rows(i,j)\n", " break\n", " if A[j,j]==0:\n", " raise ValueError(\"non invertible matrix\")\n", " for i in range(j+1, n):\n", " A.add_multiple_of_row(i, j, -A[i,j]/A[j,j])\n", " return A" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "def matrice_inversible(n, corps=QQ):\n", " # Renvoie une matrice inversible\n", " while True:\n", " m = random_matrix(corps, n)\n", " if m.det()!=0:\n", " return m" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[-1/2 0 -1 0 0]\n", "[ 0 -1 1 1 -1/2]\n", "[ -2 -2 0 1/2 -2]\n", "[ 2 0 -2 2 -1]\n", "[-1/2 1 1 1 1]" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/plain": [ "[ -1/2 0 -1 0 0]\n", "[ 0 -1 1 1 -1/2]\n", "[ 0 0 2 -3/2 -1]\n", "[ 0 0 0 -5/2 -4]\n", "[ 0 0 0 0 -24/5]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "M=matrice_inversible(5); show(M); show(gauss(M)); " ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[1 0 0 0 0]\n", "[0 1 0 0 0]\n", "[0 0 1 0 0]\n", "[0 0 0 1 0]\n", "[0 0 0 0 1]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show(M.echelon_form());" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "def max_coeff(M):\n", " return max(max(abs(c.numerator()) for row in M.rows() for c in row),\n", " max(abs(c.denominator()) for row in M.rows() for c in row))" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[ -1/2 0 1 1 -1 -2 -1 -2 -1/2 0]\n", "[ 0 1/2 2 3/2 0 -7/2 -3 -4 -1 0]\n", "[ 0 0 -5 -5 4 10 4 8 4 1]\n", "[ 0 0 0 -1 2 0 0 -1 -1 0]\n", "[ 0 0 0 0 -9/10 1 8/5 6/5 8/5 -1/10]\n", "[ 0 0 0 0 0 16/3 19/3 3 23/6 -1/3]\n", "[ 0 0 0 0 0 0 87/32 -11/32 315/64 -13/32]\n", "[ 0 0 0 0 0 0 0 67/87 -1035/58 103/174]\n", "[ 0 0 0 0 0 0 0 0 2432/201 -635/804]\n", "[ 0 0 0 0 0 0 0 0 0 2271/1024]" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/plain": [ "2432" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "G=gauss(matrice_inversible(10)); show(G); show(max_coeff(G));" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[1,\n", " 2,\n", " 4,\n", " 65,\n", " 20090477,\n", " 1192880382360512547051804985,\n", " 375777457025164771998313802791389332678265402100840617220676063425]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "t=[max_coeff(gauss(matrice_inversible(2^k))) for k in range(7)]; show(t)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[1, 2, 3, 7, 25, 90, 218]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "tt=[x.ndigits(2) for x in t]; show(tt);" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[0.0,\n", " 1.0,\n", " 1.5849625007211563,\n", " 2.807354922057604,\n", " 4.643856189774724,\n", " 6.491853096329675,\n", " 7.768184324776926]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "lt=[float(log(tt[i],2)) for i in range(len(tt))]; show(lt);" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "image/png": "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IiJGjRqVcSWN69ixY7F27dro7e2NGTNmZF1Ow+no6Ihrr7025syZk3UpDWvPnj0xduzYmDhxYtx8882xd+/erEtqOBs2bIjp06fHTTfdFK2trXHppZfGqlWrqja+wAQDUC6XY+nSpXH55ZfHlClTsi6n4ezcuTPOPvvsyOfzsXDhwli3bl20tbVlXVZDWbt2bbzwwgvR2dmZdSkN67LLLovVq1fHpk2bYtWqVXHgwIGYOXNmvPXWW1mX1lD27t0bK1asiAsuuCA2bdoUCxcujMWLF8fq1aurMr4pORiAr3/96/GLX/winn/++axLaUgf+9jH4sUXX4yDBw/G448/HgsWLIienh6hqUr2798fS5YsiaeffjrOOOOMrMtpWH+6TOLiiy+OGTNmxKRJk+L73/9+LF26NMPKGsu7774b06dPjwceeCAiIi699NLYtWtXrFixIr70pS8NeHxPmKCfFi1aFBs2bIjnnnvOi6QHyfDhw+OjH/1oTJ8+PTo7O2PatGnxyCOPZF1Ww9ixY0e8+eab8fGPfzyampqiqakpenp64tvf/nY0NTXFsWPHsi6xIY0YMSIuvvji2LNnT9alNJQxY8a873+mLrrooti3b19VxveECSpULpdj0aJFsW7duti8eXNMnDgx65JOGeVyOUqlUtZlNIzZs2e/79dat99+e1x44YVxzz33xLBhwzKqrLGVSqV46aWX4lOf+lTWpTSUWbNmva/Fy+7du2PChAlVGV9gajBHjhyJV155pW//1VdfjRdffDFGjRoV48ePz7CyxtHR0RFr1qyJJ554Ipqbm+PAgQMREdHS0hJnnnlmxtU1jnvvvTfmzZsXhUIhDh8+HGvXro3Nmze/71eK9F9zc/P71t6NGDEiRo8ebU1eFd19990xf/78GD9+fLz55ptx//33R7FYjAULFmRdWkO56667YubMmfHAAw/E5z73ufj5z38eK1eujJUrV1bnAmUaynPPPVeOiPdtCxYsyLq0hvFB9zciyt3d3VmX1lDuuOOO8oQJE8rDhw8vn3vuueXZs2eXn3766azLanhXXnllecmSJVmX0VA+//nPl8eMGVM+/fTTy2PHji3fcMMN5V27dmVdVkN68skny1OmTCnn8/nyhRdeWF65cmXVxvYuOQCABIu+AQASBCYAgASBCQAgQWACAEgQmAAAEgQmAIAEgQkAIEFgAgBIEJgAABIEJgCABIEJACBBYAIASPg/bGm/ZZAlC5cAAAAASUVORK5CYII=\n", "text/plain": [ "Graphics object consisting of 1 graphics primitive" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "points(enumerate(lt))" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "# Cela corrobore l'hypothèse d'un nombre de chiffres des numérateurs et dénominateurs polynômial en la dimension de la matrice" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "import time;" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "def temps_gauss(n):\n", " M=matrice_inversible(n)\n", " debut=time.time()\n", " gauss(M)\n", " return(time.time() - debut)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.0002124309539794922" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "temps_gauss(5)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "625 loops, best of 3: 117 μs per loop" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "timeit('gauss(M)')" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[2.1457672119140625e-05,\n", " 1.8596649169921875e-05,\n", " 4.172325134277344e-05,\n", " 0.0002300739288330078,\n", " 0.0019309520721435547,\n", " 0.022881031036376953,\n", " 0.16617679595947266,\n", " 1.777696132659912]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "t=[temps_gauss(2^k) for k in range(8)]; show(t)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[-15.508146903670326,\n", " -15.714597781137751,\n", " -14.548788888167671,\n", " -12.085614867844559,\n", " -9.016471928834905,\n", " -5.449704127275807,\n", " -2.5892091489482882,\n", " 0.830008740719973]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "tt=[float(log(t[k],2)) for k in range(8)]; show(tt)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "Graphics object consisting of 1 graphics primitive" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "points(enumerate(tt))" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "#cela corrobore une complexité polynômiale en la dimension de la matrice" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "def gauss_ent(M):\n", " A=copy(M)\n", " n=A.nrows()\n", " for j in range(n):\n", " # Recherche du pivot\n", " if A[j,j]==0:\n", " for i in range(j+1,n):\n", " if A[i,j]!=0:\n", " A.swap_rows(i,j)\n", " break\n", " if A[j,j]==0:\n", " raise ValueError(\"non invertible matrix\")\n", " for i in range(j+1, n):\n", " c=-A[i,j]; A.rescale_row(i,A[j,j]); A.add_multiple_of_row(i, j, c)\n", " return A" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[48 52 87 80 31]\n", "[30 90 71 89 48]\n", "[92 96 52 20 28]\n", "[15 19 80 71 77]\n", "[33 87 41 89 60]" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/plain": [ "[ 48 52 87 80 31]\n", "[ 0 2760 798 1872 1374]\n", "[ 0 0 -15061632 -17334528 -3920256]\n", "[ 0 0 0 31391807938560 -104565789941760]\n", "[ 0 0 0 0 -9290509432193132582141952000]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "M=random_matrix(ZZ,5,x=10,y=99); show(M); show(gauss_ent(M));" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [], "source": [ "#On voit bien que la taille des coefficients double en gros à chaque étape" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "def gauss_b(M):\n", " A=copy(M).change_ring(QQ)\n", " n=A.nrows()\n", " for j in range(n):\n", " # Recherche du pivot\n", " if A[j,j]==0:\n", " for i in range(j,n):\n", " if A[i,j]!=0:\n", " A.swap_rows(i,j)\n", " break\n", " if A[j,j]==0:\n", " raise ValueError(\"non invertible matrix\")\n", " for i in range(j+1, n):\n", " c=-A[i,j]; A.rescale_row(i,A[j,j]); A.add_multiple_of_row(i, j, c);\n", " if j>0:\n", " A.rescale_row(i,1/A[j-1,j-1]);\n", " return A" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[48 52 87 80 31]\n", "[30 90 71 89 48]\n", "[92 96 52 20 28]\n", "[15 19 80 71 77]\n", "[33 87 41 89 60]" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/plain": [ "[ 48 52 87 80 31]\n", "[ 0 2760 798 1872 1374]\n", "[ 0 0 -313784 -361136 -81672]\n", "[ 0 0 0 4936564 -16443644]\n", "[ 0 0 0 0 732193080]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show(M) ;show(gauss_b(M));" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "732193080" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "M.determinant()" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "def gauss_b_det(M):\n", " A=copy(M.change_ring(QQ))\n", " n=A.nrows(); perm=1;\n", " for j in range(n):\n", " # Recherche du pivot\n", " if A[j,j]==0:\n", " for i in range(j+1,n):\n", " if A[i,j]!=0:\n", " A.swap_rows(i,j); perm=-perm;\n", " break\n", " if A[j,j]==0:\n", " return(0)\n", " for i in range(j+1, n):\n", " c=-A[i,j]; A.rescale_row(i,A[j,j]); A.add_multiple_of_row(i, j, c);\n", " if j>0:\n", " A.rescale_row(i,1/A[j-1,j-1]);\n", " return perm*A[n-1,n-1];" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "732193080" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show(gauss_b_det(M));" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [], "source": [ "range(1,5);" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[1 1 1 2 1]\n", "[1 1 2 0 1]\n", "[1 0 2 2 0]\n", "[1 2 2 0 0]\n", "[1 0 2 1 2]" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/plain": [ "[1 1 1 2 1]\n", "[0 2 1 0 2]\n", "[0 0 1 1 0]\n", "[0 0 0 2 1]\n", "[0 0 0 0 1]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "M=matrice_inversible(5,corps=GF(3)); show(M); show(gauss(M));" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [], "source": [ "def gauss_det(M):\n", " A=copy(M)\n", " n=A.nrows(); perm=1;\n", " for j in range(n):\n", " # Recherche du pivot\n", " if A[j,j]==0:\n", " for i in range(j+1,n):\n", " if A[i,j]!=0:\n", " A.swap_rows(i,j); perm=-perm;\n", " break\n", " if A[j,j]==0:\n", " return(0)\n", " for i in range(j+1, n):\n", " A.add_multiple_of_row(i, j, -A[i,j]/A[j,j])\n", " return(perm*prod([A[i,i] for i in range(n)]))" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "2" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/plain": [ "2" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show(gauss_det(M)); show(M.determinant())" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [], "source": [ "def det_mod(M):\n", " A=copy(M); n=A.nrows();\n", " m=max(abs(A[i,j]) for i in range(n) for j in range(n));\n", " Maj=n^(n/2)*m^n;\n", " N=floor(log(2*Maj+1,2));\n", " P=Primes(); L=[P.unrank(i) for i in range(N)]\n", " D=[ZZ(gauss_det(copy(A).change_ring(GF(L[i])))) for i in range(N)]\n", " p=prod(L[i] for i in range(N)); res=crt(D,L);\n", " if res>Maj:\n", " return(res-p)\n", " return(res)" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "-27261248" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/plain": [ "-27261248" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "M=random_matrix(ZZ,5,x=10,y=99); show(M.determinant()); show(det_mod(M));" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "22" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show(crt([0,1,2],[2,3,5]));" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "22%3; 22%5" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [], "source": [ "def det_mod1(M):\n", " A=copy(M); n=A.nrows();\n", " m=max(abs(A[i,j]) for i in range(n) for j in range(n));\n", " Maj=n^(n/2)*m^n;\n", " N=floor(2*Maj);\n", " P=Primes(); p=P.next(N);\n", " d=ZZ(gauss_det(A.change_ring(GF(p))));\n", " if d>Maj:\n", " return(d-p)\n", " return(d)" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "-27261248" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/plain": [ "-27261248" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show(det_mod1(M)); show(M.determinant())" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "625 loops, best of 3: 129 μs per loop" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "timeit('gauss_det(copy(M).change_ring(QQ))')" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "625 loops, best of 3: 280 μs per loop" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "timeit('gauss_b_det(M)')" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "125 loops, best of 3: 3.94 ms per loop" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "timeit('det_mod(M)')" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "625 loops, best of 3: 1.13 ms per loop" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "timeit('det_mod1(M)')" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [], "source": [ "# On a du mal à voir l'apport de GB par rapport à Gauss classique sur cet exemple ; les méthodes modulaires sont moins rapides avec cette implémentation et en particulier la méthode modulaire à plusieurs nombres premiers est loin derrière" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [], "source": [ "M=random_matrix(ZZ,5,x=10^1000,y=10^1001)" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "125 loops, best of 3: 4.45 ms per loop" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "timeit('gauss_det(copy(M).change_ring(QQ))')" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "625 loops, best of 3: 816 μs per loop" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "timeit('gauss_b_det(M)')" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [], "source": [ "# GB est meilleur que Gauss classique, en accord avec le cours." ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [], "source": [ "M=random_matrix(ZZ,20,x=10^5,y=10^6)" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "25 loops, best of 3: 7.01 ms per loop" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "timeit('gauss_b_det(M)')" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "5 loops, best of 3: 224 ms per loop" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "timeit('det_mod(M)')" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "5 loops, best of 3: 786 ms per loop" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "timeit('det_mod1(M)')" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [], "source": [ "# La version à plusieurs nombres premiers est plus performante que celle à un seul, mais GB est bien meilleur ! Cela ne reflète pas la compléxité théorique." ] } ], "metadata": { "kernelspec": { "display_name": "SageMath 9.0", "language": "sage", "name": "sagemath" }, "language": "python", "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.8.10" } }, "nbformat": 4, "nbformat_minor": 2 }