diff --git a/ph23/ph23.ipynb b/ph23/ph23.ipynb new file mode 100644 index 0000000..687e3fe --- /dev/null +++ b/ph23/ph23.ipynb @@ -0,0 +1,325 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 50, + "id": "b0286ed1", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\\(\\displaystyle -a_{0} {\\left(u_{0} - 1\\right)} {\\left(u_{1} - 1\\right)} {\\left(u_{2} - 1\\right)} + a_{4} u_{0} {\\left(u_{1} - 1\\right)} {\\left(u_{2} - 1\\right)} + a_{2} {\\left(u_{0} - 1\\right)} u_{1} {\\left(u_{2} - 1\\right)} - a_{6} u_{0} u_{1} {\\left(u_{2} - 1\\right)} + a_{1} {\\left(u_{0} - 1\\right)} {\\left(u_{1} - 1\\right)} u_{2} - a_{5} u_{0} {\\left(u_{1} - 1\\right)} u_{2} - a_{3} {\\left(u_{0} - 1\\right)} u_{1} u_{2} + a_{7} u_{0} u_{1} u_{2}\\)" + ], + "text/latex": [ + "$\\displaystyle -a_{0} {\\left(u_{0} - 1\\right)} {\\left(u_{1} - 1\\right)} {\\left(u_{2} - 1\\right)} + a_{4} u_{0} {\\left(u_{1} - 1\\right)} {\\left(u_{2} - 1\\right)} + a_{2} {\\left(u_{0} - 1\\right)} u_{1} {\\left(u_{2} - 1\\right)} - a_{6} u_{0} u_{1} {\\left(u_{2} - 1\\right)} + a_{1} {\\left(u_{0} - 1\\right)} {\\left(u_{1} - 1\\right)} u_{2} - a_{5} u_{0} {\\left(u_{1} - 1\\right)} u_{2} - a_{3} {\\left(u_{0} - 1\\right)} u_{1} u_{2} + a_{7} u_{0} u_{1} u_{2}$" + ], + "text/plain": [ + "-a0*(u0 - 1)*(u1 - 1)*(u2 - 1) + a4*u0*(u1 - 1)*(u2 - 1) + a2*(u0 - 1)*u1*(u2 - 1) - a6*u0*u1*(u2 - 1) + a1*(u0 - 1)*(u1 - 1)*u2 - a5*u0*(u1 - 1)*u2 - a3*(u0 - 1)*u1*u2 + a7*u0*u1*u2" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\\(\\displaystyle \\left[-{\\left(u_{0} - 1\\right)} {\\left(u_{1} - 1\\right)} {\\left(u_{2} - 1\\right)}, {\\left(u_{0} - 1\\right)} {\\left(u_{1} - 1\\right)} u_{2}, {\\left(u_{0} - 1\\right)} u_{1} {\\left(u_{2} - 1\\right)}, -{\\left(u_{0} - 1\\right)} u_{1} u_{2}, u_{0} {\\left(u_{1} - 1\\right)} {\\left(u_{2} - 1\\right)}, -u_{0} {\\left(u_{1} - 1\\right)} u_{2}, -u_{0} u_{1} {\\left(u_{2} - 1\\right)}, u_{0} u_{1} u_{2}\\right]\\)" + ], + "text/latex": [ + "$\\displaystyle \\left[-{\\left(u_{0} - 1\\right)} {\\left(u_{1} - 1\\right)} {\\left(u_{2} - 1\\right)}, {\\left(u_{0} - 1\\right)} {\\left(u_{1} - 1\\right)} u_{2}, {\\left(u_{0} - 1\\right)} u_{1} {\\left(u_{2} - 1\\right)}, -{\\left(u_{0} - 1\\right)} u_{1} u_{2}, u_{0} {\\left(u_{1} - 1\\right)} {\\left(u_{2} - 1\\right)}, -u_{0} {\\left(u_{1} - 1\\right)} u_{2}, -u_{0} u_{1} {\\left(u_{2} - 1\\right)}, u_{0} u_{1} u_{2}\\right]$" + ], + "text/plain": [ + "[-(u0 - 1)*(u1 - 1)*(u2 - 1),\n", + " (u0 - 1)*(u1 - 1)*u2,\n", + " (u0 - 1)*u1*(u2 - 1),\n", + " -(u0 - 1)*u1*u2,\n", + " u0*(u1 - 1)*(u2 - 1),\n", + " -u0*(u1 - 1)*u2,\n", + " -u0*u1*(u2 - 1),\n", + " u0*u1*u2]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\\(\\displaystyle \\left[14 X^{7} + 11 X^{6} + X^{5} + 5 X^{4} + 3 X^{3} + 13 X^{2} + 10 X + 12, X^{7} + 4 X^{6} + 4 X^{5} + 5 X^{4} + 10 X^{3} + 4 X^{2} + 13 X + 10, 9 X^{7} + 5 X^{6} + 7 X^{5} + 6 X^{3} + 7 X^{2} + 4 X + 13, X^{7} + 11 X^{6} + 10 X^{4} + 10 X^{3} + 6 X^{2} + 10 X + 3, 5 X^{7} + 2 X^{6} + 3 X^{5} + 4 X^{4} + 10 X^{3} + 5 X + 5, 3 X^{7} + X^{6} + 15 X^{5} + 3 X^{4} + 7 X^{2} + 4 X + 1, 14 X^{7} + 3 X^{6} + X^{5} + 2 X^{4} + 11 X^{3} + 5 X^{2} + 4 X + 11, 4 X^{7} + 14 X^{6} + 3 X^{5} + 5 X^{4} + X^{3} + 9 X^{2} + X + 14\\right]\\)" + ], + "text/latex": [ + "$\\displaystyle \\left[14 X^{7} + 11 X^{6} + X^{5} + 5 X^{4} + 3 X^{3} + 13 X^{2} + 10 X + 12, X^{7} + 4 X^{6} + 4 X^{5} + 5 X^{4} + 10 X^{3} + 4 X^{2} + 13 X + 10, 9 X^{7} + 5 X^{6} + 7 X^{5} + 6 X^{3} + 7 X^{2} + 4 X + 13, X^{7} + 11 X^{6} + 10 X^{4} + 10 X^{3} + 6 X^{2} + 10 X + 3, 5 X^{7} + 2 X^{6} + 3 X^{5} + 4 X^{4} + 10 X^{3} + 5 X + 5, 3 X^{7} + X^{6} + 15 X^{5} + 3 X^{4} + 7 X^{2} + 4 X + 1, 14 X^{7} + 3 X^{6} + X^{5} + 2 X^{4} + 11 X^{3} + 5 X^{2} + 4 X + 11, 4 X^{7} + 14 X^{6} + 3 X^{5} + 5 X^{4} + X^{3} + 9 X^{2} + X + 14\\right]$" + ], + "text/plain": [ + "[14*X^7 + 11*X^6 + X^5 + 5*X^4 + 3*X^3 + 13*X^2 + 10*X + 12,\n", + " X^7 + 4*X^6 + 4*X^5 + 5*X^4 + 10*X^3 + 4*X^2 + 13*X + 10,\n", + " 9*X^7 + 5*X^6 + 7*X^5 + 6*X^3 + 7*X^2 + 4*X + 13,\n", + " X^7 + 11*X^6 + 10*X^4 + 10*X^3 + 6*X^2 + 10*X + 3,\n", + " 5*X^7 + 2*X^6 + 3*X^5 + 4*X^4 + 10*X^3 + 5*X + 5,\n", + " 3*X^7 + X^6 + 15*X^5 + 3*X^4 + 7*X^2 + 4*X + 1,\n", + " 14*X^7 + 3*X^6 + X^5 + 2*X^4 + 11*X^3 + 5*X^2 + 4*X + 11,\n", + " 4*X^7 + 14*X^6 + 3*X^5 + 5*X^4 + X^3 + 9*X^2 + X + 14]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\\(\\displaystyle \\left[1, 2, 3, 4, 5, 6, 7, 8\\right]\\)" + ], + "text/latex": [ + "$\\displaystyle \\left[1, 2, 3, 4, 5, 6, 7, 8\\right]$" + ], + "text/plain": [ + "[1, 2, 3, 4, 5, 6, 7, 8]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\\(\\displaystyle 16 X^{7} + 6 X^{6} + 13 X^{5} + 11 X^{4} + 12 X^{3} + 11 X^{2} + 3 X + 14\\)" + ], + "text/latex": [ + "$\\displaystyle 16 X^{7} + 6 X^{6} + 13 X^{5} + 11 X^{4} + 12 X^{3} + 11 X^{2} + 3 X + 14$" + ], + "text/plain": [ + "16*X^7 + 6*X^6 + 13*X^5 + 11*X^4 + 12*X^3 + 11*X^2 + 3*X + 14" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\\(\\displaystyle \\left[\\mathrm{True}, \\mathrm{True}, \\mathrm{True}, \\mathrm{True}, \\mathrm{True}, \\mathrm{True}, \\mathrm{True}, \\mathrm{True}\\right]\\)" + ], + "text/latex": [ + "$\\displaystyle \\left[\\mathrm{True}, \\mathrm{True}, \\mathrm{True}, \\mathrm{True}, \\mathrm{True}, \\mathrm{True}, \\mathrm{True}, \\mathrm{True}\\right]$" + ], + "text/plain": [ + "[True, True, True, True, True, True, True, True]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\\(\\displaystyle X^{7} + 2 X^{6} + 11 X^{5} + 4 X^{4} + 16 X^{3} + 7 X^{2} + 8 X + 13\\)" + ], + "text/latex": [ + "$\\displaystyle X^{7} + 2 X^{6} + 11 X^{5} + 4 X^{4} + 16 X^{3} + 7 X^{2} + 8 X + 13$" + ], + "text/plain": [ + "X^7 + 2*X^6 + 11*X^5 + 4*X^4 + 16*X^3 + 7*X^2 + 8*X + 13" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\\(\\displaystyle X^{6} + 15 X^{5} + 2 X^{4} + 13 X^{3} + 15 X^{2} + 15 X + 16\\)" + ], + "text/latex": [ + "$\\displaystyle X^{6} + 15 X^{5} + 2 X^{4} + 13 X^{3} + 15 X^{2} + 15 X + 16$" + ], + "text/plain": [ + "X^6 + 15*X^5 + 2*X^4 + 13*X^3 + 15*X^2 + 15*X + 16" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\\(\\displaystyle X^{4} + 5 X^{3} + 4 X^{2} + 12 X + 1\\)" + ], + "text/latex": [ + "$\\displaystyle X^{4} + 5 X^{3} + 4 X^{2} + 12 X + 1$" + ], + "text/plain": [ + "X^4 + 5*X^3 + 4*X^2 + 12*X + 1" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Define variables\n", + "n = 3\n", + "N = 2^n\n", + "X = var(['X{}'.format(i) for i in range(n)]) # Define the variables X_0, X-1,.....\n", + "u = var(['u{}'.format(i) for i in range(n)]) # Define the variables u_0, u-1,.....\n", + "\n", + "# Function to get binary representation as a list of bits\n", + "def bits(i,n):\n", + " return list(map(int, format(i,'0{}b'.format(n))))\n", + "\n", + "# Define the eq_tilde function\n", + "def eq_tilde(bits_i, u_vector):\n", + " result=1\n", + " for bit,u in zip(bits_i,u_vector):\n", + " result *= (1-bit)*(1-u) + bit*u\n", + " return result\n", + "\n", + "# Coefficients of the polynomial\n", + "a = [var('a{}'.format(i)) for i in range(N)] # Coefficients a_0, a_1, ...., a_(N-1)\n", + "\n", + "# MLE polynomial\n", + "f_tilde = sum(a[i]*eq_tilde(bits(i,n), u) for i in range(N))\n", + "show(f_tilde)\n", + "\n", + "# Generate all combinations of (1-u[i]) and u[i] based on binary representation\n", + "def generate_c_vector(n, u):\n", + " c_vector = []\n", + " for i in range(2^n): # Loop over all binary numbers from 0 to 2^n - 1\n", + " binary = list(map(int, format(i, f'0{n}b'))) # Binary representation of i\n", + " product = 1\n", + " for j, bit in enumerate(binary):\n", + " if bit == 0:\n", + " product *= (1 - u[j]) # Use (1 - u[j]) for 0\n", + " else:\n", + " product *= u[j] # Use u[j] for 1\n", + " c_vector.append(product)\n", + " return c_vector\n", + "\n", + "# Compute the c vector\n", + "c = generate_c_vector(n, u)\n", + "\n", + "# Display the c vector\n", + "show(c)\n", + "\n", + "# SageMath Implementation for Polynomial Encoding using Lagrange Basis\n", + "\n", + "# Define the finite field and subgroup H\n", + "p = 17 # Example prime (p must be chosen appropriately)\n", + "F = GF(p) # Finite field F_p\n", + "omega = F(3) # Example primitive 8th root of unity in F_p\n", + "H = [omega^i for i in range(8)] # Multiplicative subgroup H of size 8\n", + "\n", + "# Define Lagrange Basis Polynomials\n", + "def lagrange_basis(H, X):\n", + " basis = []\n", + " for i in range(len(H)):\n", + " Li = 1\n", + " for j in range(len(H)):\n", + " if i != j:\n", + " Li *= (X - H[j]) / (H[i] - H[j]) # Lagrange basis polynomial\n", + " basis.append(Li)\n", + " return basis\n", + "\n", + "# Symbolic variable for the polynomial\n", + "X = polygen(F, 'X')\n", + "\n", + "# Compute the Lagrange basis polynomials\n", + "L = lagrange_basis(H, X)\n", + "show(L)\n", + "\n", + "# Vector c as computed earlier\n", + "c = [F(c_val) for c_val in [1, 2, 3, 4, 5, 6, 7, 8]] # Example values for c vector\n", + "show(c)\n", + "# Compute the polynomial encoding c(X)\n", + "c_X = sum(c[i] * L[i] for i in range(len(c)))\n", + "\n", + "# Compute the polynomial encoding c(X) step by step\n", + "# c_X = 0 # Start with an empty polynomial\n", + "# print(\"Building c(X) step by step:\")\n", + "# for i in range(len(c)):\n", + "# show(c[i])\n", + "# show(L[i])\n", + "# term = c[i] * L[i] # Compute the current term\n", + "# show(term)\n", + "# c_X += term # Add the current term to the polynomial\n", + "# show(term)\n", + "# '\\n'\n", + "# # print(f\"Step {i+1}: Adding term {term}\")\n", + "# # print(f\"Partial sum: {c_X}\\n\")\n", + "\n", + "# # Final polynomial\n", + "# print(\"Final polynomial c(X):\")\n", + "# show(c_X)\n", + "\n", + "# Display the resulting polynomial c(X)\n", + "show(c_X)\n", + "\n", + "# Verification: Check that c(omega^i) = c_i\n", + "verification = [c_X(H[i]) == c[i] for i in range(len(H))]\n", + "show(verification)\n", + "\n", + "\n", + "# Define subsets H0, H1, H2 based on the Group Tower relationship\n", + "H0 = [H[0]] # {1}\n", + "H1 = [H[0], H[4]] # {1, ω^4}\n", + "H2 = [H[0], H[2], H[4], H[6]] # {1, ω^2, ω^4, ω^6}\n", + "H3 = H # Full set {1, ω, ω^2, ..., ω^7}\n", + "\n", + "# Define the vanishing polynomials v_H(X) and v_Hi(X)\n", + "X = polygen(F, 'X') # Define X as a polynomial variable\n", + "\n", + "def vanishing_polynomial(domain):\n", + " \"\"\"Compute the vanishing polynomial for a given domain.\"\"\"\n", + " v = 1\n", + " for alpha in domain:\n", + " v *= (X - alpha)\n", + " return v\n", + "\n", + "# Compute vanishing polynomials\n", + "v_H = vanishing_polynomial(H3) # Full vanishing polynomial for H\n", + "v_H0 = vanishing_polynomial(H0)\n", + "v_H1 = vanishing_polynomial(H1)\n", + "v_H2 = vanishing_polynomial(H2)\n", + "\n", + "# Compute the selector polynomials s_0(X), s_1(X), s_2(X)\n", + "s0 = v_H/v_H0\n", + "s1 = v_H/v_H1\n", + "s2 = v_H/v_H2\n", + "\n", + "# Display the selector polynomials\n", + "show(s0)\n", + "show(s1)\n", + "show(s2)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "65879a63", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "SageMath 10.0", + "language": "sage", + "name": "sagemath" + }, + "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.9.19" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}