{ "cells": [ { "cell_type": "markdown", "source": [ "# Degree gap versus staircase gap" ], "metadata": {} }, { "outputs": [ { "output_type": "execute_result", "data": { "text/plain": "Random.TaskLocalRNG()" }, "metadata": {}, "execution_count": 1 } ], "cell_type": "code", "source": [ "using TypedPolynomials\n", "using SemialgebraicSets\n", "function system(k, solver)\n", " @polyvar x y\n", " return @set x == y^k && y^k == 0 solver\n", "end\n", "using Random\n", "Random.seed!(80)" ], "metadata": {}, "execution_count": 1 }, { "cell_type": "markdown", "source": [ "Let's start with the classical approach with all columns up to degree 5 and waiting for the gap:" ], "metadata": {} }, { "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ Info: Added 2 rows to complete columns up to degree 4\n", "[ Info: Nullspace of dimensions (15, 13) computed from Macaulay matrix of dimension (2, 15) in 6.448e-5 seconds.\n", "[ Info: Added 4 rows to complete columns up to degree 5\n", "[ Info: Nullspace of dimensions (21, 15) computed from Macaulay matrix of dimension (6, 21) in 4.2128e-5 seconds.\n", "[ Info: Added 6 rows to complete columns up to degree 6\n", "[ Info: Nullspace of dimensions (28, 16) computed from Macaulay matrix of dimension (12, 28) in 5.0625e-5 seconds.\n", "[ Info: Added 8 rows to complete columns up to degree 7\n", "[ Info: Nullspace of dimensions (36, 16) computed from Macaulay matrix of dimension (20, 36) in 6.1073e-5 seconds.\n", "[ Info: Found multiplication matrices with commutation error of `0.5555434329742673` which is larger than the tolerance of `0.0001220703125`. Adding this to the equations and continuing.\n", "[ Info: Found multiplication matrices with commutation error of `0.14137366352981615` which is larger than the tolerance of `0.0001220703125`. Adding this to the equations and continuing.\n", "[ Info: Found multiplication matrices with commutation error of `0.32931221645105807` which is larger than the tolerance of `0.0001220703125`. Adding this to the equations and continuing.\n", "[ Info: Found 1 real solution\n" ] } ], "cell_type": "code", "source": [ "using MacaulayMatrix\n", "sys_gap = system(4, MacaulayMatrix.Solver(sparse_columns = false, wait_for_gap = true))\n", "solutions = collect(sys_gap)\n", "nothing #hide" ], "metadata": {}, "execution_count": 2 }, { "cell_type": "markdown", "source": [ "We find the expected solution" ], "metadata": {} }, { "outputs": [ { "output_type": "execute_result", "data": { "text/plain": "1-element Vector{Vector{Float64}}:\n [-1.7687461110662856e-16, -0.39155425716877207]" }, "metadata": {}, "execution_count": 3 } ], "cell_type": "code", "source": [ "solutions" ], "metadata": {}, "execution_count": 3 }, { "cell_type": "markdown", "source": [ "If we don't wait for the gap, we get it earlier:" ], "metadata": {} }, { "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ Info: Added 2 rows to complete columns up to degree 4\n", "[ Info: Nullspace of dimensions (15, 13) computed from Macaulay matrix of dimension (2, 15) in 3.4384e-5 seconds.\n", "┌ Warning: `LAPACK.trsen!` throwed an exception for `[3, 4]` so using default tolerance `2.220446049250313e-16`\n", "└ @ SemialgebraicSets ~/.julia/packages/SemialgebraicSets/BoKut/src/schur.jl:22\n", "[ Info: Found 1 real solution\n" ] } ], "cell_type": "code", "source": [ "using MacaulayMatrix\n", "sys = system(4, MacaulayMatrix.Solver(sparse_columns = false))\n", "solutions = collect(sys)\n", "nothing #hide" ], "metadata": {}, "execution_count": 4 }, { "cell_type": "markdown", "source": [ "We find the expected solution" ], "metadata": {} }, { "outputs": [ { "output_type": "execute_result", "data": { "text/plain": "1-element Vector{Vector{Float64}}:\n [-1.962615573354718e-16, -1.1927117914146596e-16]" }, "metadata": {}, "execution_count": 5 } ], "cell_type": "code", "source": [ "solutions" ], "metadata": {}, "execution_count": 5 }, { "cell_type": "markdown", "source": [ "But we can actually also just use the 2 columns that are actually used:" ], "metadata": {} }, { "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ Info: Added 2 rows to complete columns up to degree 4\n", "[ Info: Nullspace of dimensions (2, 0) computed from Macaulay matrix of dimension (2, 2) in 1.7833e-5 seconds.\n", "[ Info: Found 1 real solution\n" ] } ], "cell_type": "code", "source": [ "sys_sparse = system(4, MacaulayMatrix.Solver())\n", "solutions = collect(sys_sparse)\n", "nothing #hide" ], "metadata": {}, "execution_count": 6 }, { "cell_type": "markdown", "source": [ "We find the expected solution" ], "metadata": {} }, { "outputs": [ { "output_type": "execute_result", "data": { "text/plain": "1-element Vector{Vector{Float64}}:\n [0.0, 0.0]" }, "metadata": {}, "execution_count": 7 } ], "cell_type": "code", "source": [ "solutions" ], "metadata": {}, "execution_count": 7 }, { "cell_type": "markdown", "source": [ "## In more details" ], "metadata": {} }, { "outputs": [ { "output_type": "execute_result", "data": { "text/plain": "MacaulayMatrix matrix solver. Last iteration considered:\n0×0 Macaulay matrix for polynomials:\n x - y^4\n y^4\nThe row shifts are:\nMonomialBasis([])\nThe column basis is:\nMonomialBasis([])\nCurrent status is OPTIMIZE_NOT_CALLED\nHistory of iterations:\n\u001b[1m0×3 DataFrame\n\u001b[1m Row │\u001b[1m nullity \u001b[1m num_rows \u001b[1m num_cols\n │\u001b[90m Int64 \u001b[90m Int64 \u001b[90m Int64\n─────┴─────────────────────────────" }, "metadata": {}, "execution_count": 8 } ], "cell_type": "code", "source": [ "solver_gap = init(sys_gap, sys_gap.solver)" ], "metadata": {}, "execution_count": 8 }, { "cell_type": "markdown", "source": [ "After one step, we don't have the solution yet" ], "metadata": {} }, { "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ Info: Added 2 rows to complete columns up to degree 4\n", "[ Info: Nullspace of dimensions (15, 13) computed from Macaulay matrix of dimension (2, 15) in 4.8229e-5 seconds.\n" ] } ], "cell_type": "code", "source": [ "step!(solver_gap)" ], "metadata": {}, "execution_count": 9 }, { "cell_type": "markdown", "source": [ "After the second step, still no solution" ], "metadata": {} }, { "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ Info: Added 4 rows to complete columns up to degree 5\n", "[ Info: Nullspace of dimensions (21, 15) computed from Macaulay matrix of dimension (6, 21) in 3.0326e-5 seconds.\n" ] } ], "cell_type": "code", "source": [ "step!(solver_gap)" ], "metadata": {}, "execution_count": 10 }, { "cell_type": "markdown", "source": [ "After the third step, still no solution" ], "metadata": {} }, { "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ Info: Added 6 rows to complete columns up to degree 6\n", "[ Info: Nullspace of dimensions (28, 16) computed from Macaulay matrix of dimension (12, 28) in 4.1838e-5 seconds.\n" ] } ], "cell_type": "code", "source": [ "step!(solver_gap)" ], "metadata": {}, "execution_count": 11 }, { "cell_type": "markdown", "source": [ "After the fourth step, we find the solution" ], "metadata": {} }, { "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ Info: Added 8 rows to complete columns up to degree 7\n", "[ Info: Nullspace of dimensions (36, 16) computed from Macaulay matrix of dimension (20, 36) in 6.3197e-5 seconds.\n", "[ Info: Found multiplication matrices with commutation error of `0.5555434329742673` which is larger than the tolerance of `0.0001220703125`. Adding this to the equations and continuing.\n", "[ Info: Found multiplication matrices with commutation error of `0.14137366352981615` which is larger than the tolerance of `0.0001220703125`. Adding this to the equations and continuing.\n", "[ Info: Found multiplication matrices with commutation error of `0.32931221645105807` which is larger than the tolerance of `0.0001220703125`. Adding this to the equations and continuing.\n", "[ Info: Found 1 real solution\n" ] } ], "cell_type": "code", "source": [ "step!(solver_gap)" ], "metadata": {}, "execution_count": 12 }, { "cell_type": "markdown", "source": [ "We can inspect the solver at follows" ], "metadata": {} }, { "outputs": [ { "output_type": "execute_result", "data": { "text/plain": "MacaulayMatrix matrix solver. Last iteration considered:\n20×36 Macaulay matrix for polynomials:\n x - y^4\n y^4\nThe row shifts are:\nMonomialBasis([1, y, x, y^2, x*y, x^2, y^3, x*y^2, x^2*y, x^3])\nThe column basis is:\nMonomialBasis([1, y, x, y^2, x*y, x^2, y^3, x*y^2, x^2*y, x^3, y^4, x*y^3, x^2*y^2, x^3*y, x^4, y^5, x*y^4, x^2*y^3, x^3*y^2, x^4*y, x^5, y^6, x*y^5, x^2*y^4, x^3*y^3, x^4*y^2, x^5*y, x^6, y^7, x*y^6, x^2*y^5, x^3*y^4, x^4*y^3, x^5*y^2, x^6*y, x^7])\nBorderBasis with independent rows and dependent columns in:\nBasisDependence for bases:\n Standard:\n MonomialBasis([1, y, y^2, y^3])\n Corners:\n MonomialBasis([x, y^4])\n Dependent Border:\n MonomialBasis([x*y, x*y^2, x*y^3])\n\nAnd entries in a 4×5 adjoint(::Matrix{Float64}) with eltype Float64:\n -2.172825010123334e-16 1.8952692539670457e-16 … -2.7755575615628892e-17\n -1.062601985498177e-16 1.8952692539670447e-16 2.7755575615628944e-17\n 5.55111512312578e-17 -1.1102230246251565e-16 -2.775557561562892e-17\n 6.943015803029501e-34 9.720222124241336e-33 -3.471507901514769e-34\nCurrent status is OPTIMAL\nFound 1 solutions:\n [-1.7687461110662856e-16, -0.39155425716877207]\nHistory of iterations:\n\u001b[1m4×3 DataFrame\n\u001b[1m Row │\u001b[1m nullity \u001b[1m num_rows \u001b[1m num_cols\n │\u001b[90m Int64 \u001b[90m Int64 \u001b[90m Int64\n─────┼─────────────────────────────\n 1 │ 13 2 15\n 2 │ 15 6 21\n 3 │ 16 12 28\n 4 │ 16 20 36" }, "metadata": {}, "execution_count": 13 } ], "cell_type": "code", "source": [ "solver_gap" ], "metadata": {}, "execution_count": 13 }, { "cell_type": "markdown", "source": [ "The border dependence can be plotted for more visual inspection:" ], "metadata": {} }, { "outputs": [ { "output_type": "execute_result", "data": { "text/plain": "Plot{Plots.GRBackend() n=3}", "image/png": "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", "text/html": [ "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ], "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ] }, "metadata": {}, "execution_count": 14 } ], "cell_type": "code", "source": [ "using Plots\n", "plot(saturated_dependence(solver_gap))" ], "metadata": {}, "execution_count": 14 }, { "cell_type": "markdown", "source": [ "We can see that the monomials of larger degree have not been used here.\n", "We can see them used with `AnyDependence` instead of `StaircaseDependence`" ], "metadata": {} }, { "outputs": [ { "output_type": "execute_result", "data": { "text/plain": "MacaulayMatrix matrix solver. Last iteration considered:\n0×0 Macaulay matrix for polynomials:\n x - y^4\n y^4\nThe row shifts are:\nMonomialBasis([])\nThe column basis is:\nMonomialBasis([])\nCurrent status is OPTIMIZE_NOT_CALLED\nHistory of iterations:\n\u001b[1m0×3 DataFrame\n\u001b[1m Row │\u001b[1m nullity \u001b[1m num_rows \u001b[1m num_cols\n │\u001b[90m Int64 \u001b[90m Int64 \u001b[90m Int64\n─────┴─────────────────────────────" }, "metadata": {}, "execution_count": 15 } ], "cell_type": "code", "source": [ "solver_gap = init(sys_gap, MacaulayMatrix.Solver(dependence = MacaulayMatrix.MM.LinearDependence, sparse_columns = false, wait_for_gap = true))" ], "metadata": {}, "execution_count": 15 }, { "cell_type": "markdown", "source": [ "Let's solve again but not all the step at once:" ], "metadata": {} }, { "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ Info: Added 2 rows to complete columns up to degree 4\n", "[ Info: Nullspace of dimensions (15, 13) computed from Macaulay matrix of dimension (2, 15) in 4.841e-5 seconds.\n", "[ Info: Added 4 rows to complete columns up to degree 5\n", "[ Info: Nullspace of dimensions (21, 15) computed from Macaulay matrix of dimension (6, 21) in 2.6159e-5 seconds.\n", "[ Info: Added 6 rows to complete columns up to degree 6\n", "[ Info: Nullspace of dimensions (28, 16) computed from Macaulay matrix of dimension (12, 28) in 3.5906e-5 seconds.\n", "[ Info: Added 8 rows to complete columns up to degree 7\n", "[ Info: Nullspace of dimensions (36, 16) computed from Macaulay matrix of dimension (20, 36) in 5.7116e-5 seconds.\n", "[ Info: Found multiplication matrices with commutation error of `0.5555434329742674` which is larger than the tolerance of `0.0001220703125`. Adding this to the equations and continuing.\n", "[ Info: Found multiplication matrices with commutation error of `0.1413736635298159` which is larger than the tolerance of `0.0001220703125`. Adding this to the equations and continuing.\n", "[ Info: Found multiplication matrices with commutation error of `0.32931221645105857` which is larger than the tolerance of `0.0001220703125`. Adding this to the equations and continuing.\n", "[ Info: Found 1 real solution\n" ] }, { "output_type": "execute_result", "data": { "text/plain": "1-element Vector{Vector{Float64}}:\n [-1.7687461110662856e-16, -0.3915542571687721]" }, "metadata": {}, "execution_count": 16 } ], "cell_type": "code", "source": [ "solve!(solver_gap)" ], "metadata": {}, "execution_count": 16 }, { "cell_type": "markdown", "source": [ "This time, we see the monomials at infinity as the blue balls outside the staircase.\n", "We can see that the degree 4 contains no independent as it is the gap zone." ], "metadata": {} }, { "outputs": [ { "output_type": "execute_result", "data": { "text/plain": "Plot{Plots.GRBackend() n=4}", "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlgAAAGQCAIAAAD9V4nPAAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nOzdZ1gUVxsG4DPb6SxSRUVAFFQUNFjBEnvvDWOJNcYSY0I00cT0L6KJvYKKaIyxxkbsQRGMiiViCaKCdOl1++58PyZZV4oCArNmnvvyx+xhmHk54D47M2fOUDRNEwAAAK7isV0AAAAAmxCEAADAaQhCAADgNAQhAABwGoIQAAA4DUEIAACchiAEAABOQxACAACnIQgBAIDTEIQAAMBptR+EkZGRx44dq/XNcpNarWa7hBdotVpjm5PP2LpIo9Ggi14OXfRKRthF/221H4TXr1+/fPlyrW+WmxQKBdslvEClUmm1WrareIERdpFOp2O7ihegi17JCLsIQVifcGoUAAA4DUEIAACchiAEAABOQxACAACnCaq43r179+7fv2/YMmLECIGgqt8OVUcTWn+dXEfrdPQ/wwp4FD61AADUvqom2d27dw8dOsQsJyQkPHv2bOTIkXVWFaetuPTF0Qf7y7cv7vb1cK9x9V8PAMB/W1WDcNy4cePG/fMuPHz48P79+/P5/DqrCgAAoJ5U+2zbs2fPIiIipkyZUhfVAAAA1LNqX+TbtWtXp06dPD09K1vh2bNnly5dCgoKYl4KhcJ58+Y1aNCg5jVyTGV3rGs0GqVSWc/FlKFUKnU6nVHdU69UKkUiEdtVPMf8jozqfAm66JWMsIsoiuLxMCygFohEIoqiXr5OtYMwLCxs8eLFL1mBoiiJRGJtbW3YUt29AAAA1I/qBWF0dHRKSsqoUaNeso69vX2nTp2WLl36eoVxV2WflAUCgVgsrudiytDpdEKh0KhGC6tUKta7xZBWqxWLxUZ1uGMMXXTr1q3//e9/zLJWq+XxeEb1+Vir1RrVr8wIu4h1ZmZmO3bsqKM+qd472o4dOyZMmGBubl4XpQDAf9Xdu3efPXs2b948tguBN9WECRNCQkLq6FN4NTZaUlJy4MCBs2fP1kUdoEdRPIpU8KmnwkaAN4WLi8uYMWPYrgLeVIGBgXW38WoEoUwmCwsL69ixY91VA4SQxQFfLQ74ilkuLi62sLBgtx4AgP+2aoxKsre3x030AADwH4PhuQAAwGkIQgAA4DQEIQAAcBqCEADeAFqtdvfu3f3efruRg4OzvX2vbgHbt29Xq9Vs1wX/BQhCADB2hYWFPfz9P503t0Xiw6X21l84StukJn390aLOfm9lZ2fXeLNyuXzRokXFxcVVXL9Dhw6xsbE13l11TZgwYf/+Ch5E83JxcXGpqal1Uc9/GIIQAIxd4Jgx2ieP9rZqNrmRo5+1RXsri4nODntbuVs9yxg5dIj++Z3VJZfLV69eXVJSUsX1i4qKNBpNzfZVAyUlJSqVqrrf9d133x0/frwu6vkPM6K5sgAAyouJiYmKijri08KU/8IHdzGPt9zVedSdu6dOnRowYMBr7uXcuXPOzs4PHz68du1ax44dhw4dyrQXFhaGh4fn5eVNmDDBcP3Hjx8fO3ZMJpMNHDjQ19eXEPLkyZMHDx44OTkdOXKkSZMmkydP1s9sFxsbe/bsWaFQOGbMGBcXF0LI9evXtVqtSqU6ffq0p6fnxIkTmSm2VSrV7t27k5KShg0bZri7rKysgwcPZmVl9ejRo0ePHoSQnJycs2fPdu3aNTw8XCQSvfvuu3Z2dnFxcY8fP+bz+Xw+38vLKyAg4DW7hSNwRAgARi0iIsLfxsqqorm1TPn8HtbmESdq4QAoJCRk8uTJFy5ccHBwmDt37u7duwkhKpXK398/NjbWyclp5syZOTk5zMoXL17s1auXUqm0trYeNWrUyZMnCSGxsbHvvffekiVLXFxcjh07NmTIEP2WJ02aZGlpqVKpunbt+vDhQ0LIb7/9NmvWrJ07dzZs2HDVqlVfffXPHBojRow4dOiQi4vLsmXL/vrrL6bx4cOHHTp0SE9Pb9iw4QcffLBx40ZCSHJy8ty5c2fOnGltbR0XF9erVy+dTvf6/cBNOCIEAKOWkpTUkF/pR/ZGIuHjJ09qZUc+Pj5r164lhIhEoiNHjkyaNOnAgQOmpqa7du0ihPTr18/NzY1ZMygo6KeffmImGHF3d//qq68GDRpECCkqKjp06JCFhcWUKVNcXV2joqL8/PyCgoJiY2ObNWtGCOHz+atXr968eTMhpEGDBjt37iSEtGjRYtGiRV999dXVq1dv3bqVlJQkEokCAwMbN27M7O7LL798//33P/nkE0JIz549u3btOnfuXEJIcXFxeHi4g4PDnDlz7O3tHz165O3t7e7u7u/vP2vWrFrpE45AEAKAUTMzNy+q/FhHrtOZmdXOYwB8fHyYBWdnZ2YMzr179zp16sQ0uri4ODk5EUK0Wu1ff/31008/MXkml8vj4+OZdVq1asXMiSgUCt966627d+9KpdLS0tI5c+YwK2RnZ9vY2Lxkd76+vsyTEU1NTdu0acOscOPGjfj4eP08zzk5Obm5uYQQJycnBwcHQgifz3d0dMzOzm7evHmtdAXXIAgBwKj5tGu3/tDByr76l1w9spYmQC7/JCYTExP96VBCiEKhIITweDyxWLxmzRp3d3emXf9sIGYFhlwuNzU1NTExEYvF+/bt0z9lV//8hPIPUjAxMSmzBX374sWL+/Tpo/+SlZXV06dPDQumKKrGg4YA1wgBwKiNGjUqVaH8I7eg/JeuFhTdKSqqu+cSdOvWLSIioqioiBBy+vRp5jiMoqh+/frt2bPH2tpaKpVKpVL97Yx37ty5d+8eISQ1NfXKlSv+/v5NmzZt3LjxsWPHmDWtra2VSmVlu+vcufP169efPn1KCImPj79x4wbTPmDAgL1791pYWDAb0Wg0L3l4vbW1dV5eXu31ASfgiBAAjFqDBg02h4RMnzIlT60e5mAroChCiI6mI7LyfkzJWLtuvbOzcx3tunv37sOGDWvTpk3r1q3lcnmTJk2Y9nXr1o0fP75NmzbNmjV78uSJn59faGgoIcTb23vatGkODg7Xr1//7LPPmEPGX375ZcKECaGhoba2tvfv3587d+7ChQsr3F3Tpk2//PLLjh07dujQISMjgxmMSghZtmzZ1KlTPT09vb2909PTzczMLly4UFnN77zzzpgxY/bv3z927Fg8IL2Kav9oeuXKldnZ2cHBwbW7WW4ytscwyeVyY3tCvbF1kUwmM7Yn1BtDF+3evfvs2bPh4eE13sKJEyfmvTe7MC/f08qCR1HxRcUSc4vV69e/zjMOaZrOzs62tbXl8XilpaUCgYC54UGtVisUCn2nJSUl5ebm+vr6lpSUmJqa6v/+nz59mpGR0bhxYyaJ9+/fHxIScvLkydu3bzdq1Khhw4b6HWk0midPnuTl5TVv3py5Rsic9jQxMSGEaLXakpISKysrZuWMjIzk5GQfHx+1Wi0SiZhLhoSQzMzMpKQke3t7ZsxOme8qKioyrK2goEAkEpmamta4c4yNUCiUy+XsP5gXAIAtgwcPHvA0+cqVK3FxcTRNt2rVqkuXLkKh8HW2SVGUvb09s2xmZqZvFwqFhltu2rRp06ZNCSGWlpaG3+7i4sLcFGhIJBJ16NChTKNAICgzjIWJQAafz9fnGSHEycmJGZWjvw2R4ejo6OjoWNl3lanN2tqaQJUhCAHgzcDn8/39/f39/QlNk3/HpxgPT0/PcePGsV0F1ASCEADeALRanX3scM7JY/KkJ4SmJU2aNug/yH7UON6/Zw5Z16ZNG/0ND/BmwahRADB22uKi+AWzk9eslCXE02o1rdHInzxK3bT27/feVb/eCMmSkpIVK1YMHz58yJAhCxcuvHPnzktWvnDhwkvGfFbdnTt30tLSqr7+hg0bFixYUKbxypUrK1asqOIWEhISWrRoUfU9viaNRmNjY1P1SVz1aquHqwtBCADG7snXy0ruVhBRsoT4x8uCyGuM+AsMDIyMjJw3b95HH33k7OwcFxf3kpUHDRrE3EHxmr755htmVrYqUigUMpmsTOPff/996NChKm5Bq9UWFhZWfY+vLz8/vwYjMWurh6sLp0YBwKgV37xe+GdMZV8tifsrPypS2q1nDbasVCojIiLu3bvHHC0xk1kTQlQq1bFjx2JjYymK6t27d69evQghv/zyi0aj2bhxo6Wl5ejRo4uKilJSUpi5uVUq1erVq4OCgng83vbt27t16/b7778nJyevWrUqJibm/PnzeXl5bdq0eeedd4RC4bVr1+Lj43U6XX5+vq+vb9++fWma3r9//40bNxwdHadPn64fAnPgwIErV674+vq+MlFWrVo1fvz4PXv25Ofnjx07tn379kz7zZs39+/fL5VKu3fvbrj+yZMno6KirK2tp0yZwgzMOX78uKOj4927d+/evRsQEDB8+HBmTa1Wu3fv3jt37jRp0mTatGnMkKLt27f36NEjIiIiKSlp4MCBTP8QQh4/frx7926apt99913D3UVHR586dUooFI4bN47p6suXLyuVSrVaffr0aQ8Pj1mzZgkEgjI9rJ+voB7giBAAjFr+pciXr1Bw6Y+abVksFjs4OGzatKnMicrMzMzz58+3atXKzc3tvffe27NnDyHE3NycoigrKyupVCoUCq9cubJv3z5mfaVSuWTJEmbO69WrV48YMaKwsNDDw4MQsm/fPgcHBz8/v8OHD0+ePJkQIpFIhEKhqampVCplbm+YMGHCzz//3LZt28zMzI4dOzJ3Vnz77bfffPONr6/vrVu3NmzY8PIfZNmyZYGBgRYWFlZWVj169GCeR3j16tV+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", "text/html": [ "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ], "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ] }, "metadata": {}, "execution_count": 17 } ], "cell_type": "code", "source": [ "using Plots\n", "plot(saturated_dependence(solver_gap))" ], "metadata": {}, "execution_count": 17 }, { "cell_type": "markdown", "source": [ "## Not waiting for the gap in more details" ], "metadata": {} }, { "outputs": [ { "output_type": "execute_result", "data": { "text/plain": "MacaulayMatrix matrix solver. Last iteration considered:\n0×0 Macaulay matrix for polynomials:\n x - y^4\n y^4\nThe row shifts are:\nMonomialBasis([])\nThe column basis is:\nMonomialBasis([])\nCurrent status is OPTIMIZE_NOT_CALLED\nHistory of iterations:\n\u001b[1m0×3 DataFrame\n\u001b[1m Row │\u001b[1m nullity \u001b[1m num_rows \u001b[1m num_cols\n │\u001b[90m Int64 \u001b[90m Int64 \u001b[90m Int64\n─────┴─────────────────────────────" }, "metadata": {}, "execution_count": 18 } ], "cell_type": "code", "source": [ "solver = init(sys, sys.solver)" ], "metadata": {}, "execution_count": 18 }, { "cell_type": "markdown", "source": [ "After one step, we find the solution" ], "metadata": {} }, { "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ Info: Added 2 rows to complete columns up to degree 4\n", "[ Info: Nullspace of dimensions (15, 13) computed from Macaulay matrix of dimension (2, 15) in 4.8971e-5 seconds.\n", "[ Info: Found 1 real solution\n" ] } ], "cell_type": "code", "source": [ "step!(solver)" ], "metadata": {}, "execution_count": 19 }, { "cell_type": "markdown", "source": [ "We can inspect `m` for more details" ], "metadata": {} }, { "outputs": [ { "output_type": "execute_result", "data": { "text/plain": "MacaulayMatrix matrix solver. Last iteration considered:\n2×15 Macaulay matrix for polynomials:\n x - y^4\n y^4\nThe row shifts are:\nMonomialBasis([1])\nThe column basis is:\nMonomialBasis([1, y, x, y^2, x*y, x^2, y^3, x*y^2, x^2*y, x^3, y^4, x*y^3, x^2*y^2, x^3*y, x^4])\nBorderBasis with independent rows and dependent columns in:\nBasisDependence for bases:\n Standard:\n MonomialBasis([1, y, y^2, y^3])\n Corners:\n MonomialBasis([x, y^4])\n Independent Border:\n MonomialBasis([x*y, x*y^2, x*y^3])\n\nAnd entries in a 4×2 adjoint(::Matrix{Float64}) with eltype Float64:\n -1.9626155733547191e-16 -3.925231146709439e-17\n -1.1775693440128314e-16 -1.1775693440128314e-16\n 0.0 0.0\n 0.0 0.0\nCurrent status is OPTIMAL\nFound 1 solutions:\n [-1.962615573354719e-16, 7.031051088568496e-17]\nHistory of iterations:\n\u001b[1m1×3 DataFrame\n\u001b[1m Row │\u001b[1m nullity \u001b[1m num_rows \u001b[1m num_cols\n │\u001b[90m Int64 \u001b[90m Int64 \u001b[90m Int64\n─────┼─────────────────────────────\n 1 │ 13 2 15" }, "metadata": {}, "execution_count": 20 } ], "cell_type": "code", "source": [ "solver" ], "metadata": {}, "execution_count": 20 }, { "cell_type": "markdown", "source": [ "The border dependence can be plotted for more visual inspection:" ], "metadata": {} }, { "outputs": [ { "output_type": "execute_result", "data": { "text/plain": "Plot{Plots.GRBackend() n=3}", "image/png": "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MGmAvb19jZOZXbx4UTmXK4Ro06aNg4NDcnJy27ZtKxcmhGjfvr1yNOnj41NSUlJQUJCQkFBaWmp642BOTk779v99y2NISIhpo3PmzGnZsmW/fv1GjBjx4osvmh7/bwgIQgCNkJVKvXDQO0KIO2XhuOBnX+sz7wG34ufnN2nSpIqKikWLFgkhli5d2qZNm927dwshNm/evG7duuofUY5slOXbt29X/pLyZl0hxL59+/bu3ZuYmGhnZ5eVleXp6am8a7AyR0fHgQMHfvzxx6YWrVabmJhYeczbt28rpz0r69Wr17Fjx5QX81bm5ORk+qzBYCgqKjJNOmMqTPx+3m2Fg4ODk5OTch5YoUw3U+WD77zzzp///Oe9e/euXr36559//ve//y0aDK4RAmiclCwc2mpE9S89YArqdLoDBw4YjUYhhNFo/P777wMDA4UQOTk5ytFYaWmpabJsJycna2tr09XEFi1a/PTTT0qwbd26tcbxc3JyXFxclEnU1q5da2p3c3MzjRMeHn7w4MHs7Gzl6qMy03fbtm2trKz2798vhMjMzFQiuYo33ngjOjp627ZtympJScn8+fOFEAMHDvz8888LCwuFEFu2bPH19VXueflDbdu2dXd337lzp1KJs7OzMkhler0+JyfHzc1twoQJM2fOTEpKqs3I9YYgBNBo1ZiF44KffbVPDe98r72ysrL/+7//8/b27tu3b4sWLY4fP75q1SohxIwZM957772hQ4d269bNNFm2Wq2eM2dO165dW7Zsee7cuaeeeqq0tDQ4OLhr1653Gn/48OF5eXk9evTo06fP9evXTe0vvfTS4sWLW7ZsuXr16k6dOr3//vv9+vUbOHBgaGhop06d0tPTbW1t161bN2nSpLCwsLCwsBpPjfbp0+fzzz+fO3euv79/SEhI06ZNb968KYSYMGFC375927Vr179//7feemvTpk21nM/MxsZm27Zty5cv7969++DBg1u2bLl3794qfXJyctq0aRMaGjps2LC33npr3rwHPRavW8w1CtSsgUy2aSkNZPfrZq5RY8XiQ28o50iVFFQJ1YPXlpGRoTwM4Ovrq8yILYQoKChISUkJCAjQarWVJ90WQuh0OmXS7fLy8qSkJDc3N09PzztNul1eXn7p0iXlXs3Kk24LIQoLCzUajXK8WFZWlpycrNFoWrRoYTppWVRUlJyc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", "text/html": [ "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ], "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ] }, "metadata": {}, "execution_count": 21 } ], "cell_type": "code", "source": [ "plot(saturated_dependence(solver))" ], "metadata": {}, "execution_count": 21 }, { "cell_type": "markdown", "source": [ "Even if there is no gap, the border is complete so we can get the multiplication matrices." ], "metadata": {} }, { "cell_type": "markdown", "source": [ "## Sparse columns in more details" ], "metadata": {} }, { "outputs": [ { "output_type": "execute_result", "data": { "text/plain": "MacaulayMatrix matrix solver. Last iteration considered:\n0×0 Macaulay matrix for polynomials:\n x - y^4\n y^4\nThe row shifts are:\nMonomialBasis([])\nThe column basis is:\nMonomialBasis([])\nCurrent status is OPTIMIZE_NOT_CALLED\nHistory of iterations:\n\u001b[1m0×3 DataFrame\n\u001b[1m Row │\u001b[1m nullity \u001b[1m num_rows \u001b[1m num_cols\n │\u001b[90m Int64 \u001b[90m Int64 \u001b[90m Int64\n─────┴─────────────────────────────" }, "metadata": {}, "execution_count": 22 } ], "cell_type": "code", "source": [ "sparse_solver = init(sys_sparse, sys_sparse.solver)" ], "metadata": {}, "execution_count": 22 }, { "cell_type": "markdown", "source": [ "After one step, we find the solution" ], "metadata": {} }, { "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ Info: Added 2 rows to complete columns up to degree 4\n", "[ Info: Nullspace of dimensions (2, 0) computed from Macaulay matrix of dimension (2, 2) in 3.0487e-5 seconds.\n", "[ Info: Found 1 real solution\n" ] } ], "cell_type": "code", "source": [ "step!(sparse_solver)" ], "metadata": {}, "execution_count": 23 }, { "cell_type": "markdown", "source": [ "We can inspect `m` for more details" ], "metadata": {} }, { "outputs": [ { "output_type": "execute_result", "data": { "text/plain": "MacaulayMatrix matrix solver. Last iteration considered:\n2×2 Macaulay matrix for polynomials:\n x - y^4\n y^4\nThe row shifts are:\nMonomialBasis([1])\nThe column basis is:\nMonomialBasis([x, y^4])\nBorderBasis with independent rows and dependent columns in:\nBasisDependence for bases:\n Trivial Standard:\n MonomialBasis([1, y, y^2, y^3])\n Corners:\n MonomialBasis([x, y^4])\n Trivial Independent Border:\n MonomialBasis([x*y, x*y^2, x*y^3])\n\nAnd entries in a 0×2 adjoint(::Matrix{Float64}) with eltype Float64\nCurrent status is OPTIMAL\nFound 1 solutions:\n [0.0, 0.0]\nHistory of iterations:\n\u001b[1m1×3 DataFrame\n\u001b[1m Row │\u001b[1m nullity \u001b[1m num_rows \u001b[1m num_cols\n │\u001b[90m Int64 \u001b[90m Int64 \u001b[90m Int64\n─────┼─────────────────────────────\n 1 │ 0 2 2" }, "metadata": {}, "execution_count": 24 } ], "cell_type": "code", "source": [ "sparse_solver" ], "metadata": {}, "execution_count": 24 }, { "cell_type": "markdown", "source": [ "The border dependence can be plotted for more visual inspection:" ], "metadata": {} }, { "outputs": [ { "output_type": "execute_result", "data": { "text/plain": "Plot{Plots.GRBackend() n=3}", "image/png": "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", "text/html": [ "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ], "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ] }, "metadata": {}, "execution_count": 25 } ], "cell_type": "code", "source": [ "plot(saturated_dependence(sparse_solver))" ], "metadata": {}, "execution_count": 25 }, { "cell_type": "markdown", "source": [ "As we can see, for the sparse one, the standard monomials are \"trivial\"\n", "because they are trivially detected as independent since they are not part of the basis.\n", "The border is missing but the multiplication matrix for `y` can be computed first\n", "and then, using this multiplication matrix, the missing relations for the border\n", "can be obtained and then the multiplication matrix for `x` can be obtained." ], "metadata": {} }, { "cell_type": "markdown", "source": [ "---\n", "\n", "*This notebook was generated using [Literate.jl](https://github.com/fredrikekre/Literate.jl).*" ], "metadata": {} } ], "nbformat_minor": 3, "metadata": { "language_info": { "file_extension": ".jl", "mimetype": "application/julia", "name": "julia", "version": "1.11.0" }, "kernelspec": { "name": "julia-1.11", "display_name": "Julia 1.11.0", "language": "julia" } }, "nbformat": 4 }