revisions to polycount.cell2
This commit is contained in:
parent
5cb572e3e1
commit
bce371e2a8
1
.gitignore
vendored
1
.gitignore
vendored
@ -3,4 +3,5 @@ _site/
|
|||||||
/.quarto/
|
/.quarto/
|
||||||
index_files/
|
index_files/
|
||||||
.jupyter_cache/
|
.jupyter_cache/
|
||||||
|
*.quarto_ipynb
|
||||||
__pycache__/
|
__pycache__/
|
||||||
|
|||||||
@ -3,7 +3,7 @@ title: "Polynomial Counting 4: Two 2's"
|
|||||||
format:
|
format:
|
||||||
html:
|
html:
|
||||||
html-math-method: katex
|
html-math-method: katex
|
||||||
date: "2021-02-06"
|
date: "2021-02-09"
|
||||||
date-modified: "2025-02-12"
|
date-modified: "2025-02-12"
|
||||||
jupyter: python3
|
jupyter: python3
|
||||||
categories:
|
categories:
|
||||||
|
|||||||
@ -3,8 +3,8 @@ title: "Polynomial Counting 5: Pentamerous multiplication"
|
|||||||
format:
|
format:
|
||||||
html:
|
html:
|
||||||
html-math-method: katex
|
html-math-method: katex
|
||||||
date: "2021-02-09"
|
date: "2021-02-12"
|
||||||
date-modified: "2025-2-12"
|
date-modified: "2025-02-12"
|
||||||
jupyter: python3
|
jupyter: python3
|
||||||
categories:
|
categories:
|
||||||
- algebra
|
- algebra
|
||||||
|
|||||||
@ -22,7 +22,7 @@ def animate(
|
|||||||
def animate_carry_count(
|
def animate_carry_count(
|
||||||
carry: Carry,
|
carry: Carry,
|
||||||
dims: int = 100,
|
dims: int = 100,
|
||||||
operation: Literal["add", "multiply"] = "add",
|
operation: Literal["add", "multiply", "log"] = "add",
|
||||||
op_val=1,
|
op_val=1,
|
||||||
center: tuple[int, int] | None = None,
|
center: tuple[int, int] | None = None,
|
||||||
# Animation parameters
|
# Animation parameters
|
||||||
@ -49,18 +49,18 @@ def animate_carry_count(
|
|||||||
else:
|
else:
|
||||||
center = (0, 0)
|
center = (0, 0)
|
||||||
|
|
||||||
if operation == "add":
|
if operation == "add" or operation == "log":
|
||||||
next_func = partial(add, carry=carry, val=op_val, center=center)
|
next_func = partial(add, carry=carry, center=center)
|
||||||
elif operation == "multiply":
|
elif operation == "multiply":
|
||||||
if op_val == 1:
|
if op_val == 1:
|
||||||
raise ValueError(f"too small value {op_val} for repeated multiplication")
|
raise ValueError(f"too small value {op_val} for repeated multiplication")
|
||||||
next_func = partial(times, carry=carry, val=op_val)
|
next_func = partial(times, carry=carry)
|
||||||
else:
|
else:
|
||||||
raise ValueError(f"Cannot use {repr(operation)} for animation")
|
raise ValueError(f"Cannot use {repr(operation)} for animation")
|
||||||
|
|
||||||
expansion = np.zeros((dims, dims))
|
expansion = np.zeros((dims, dims))
|
||||||
expansion[center] = 1
|
expansion[center] = 1
|
||||||
title = [1]
|
state = [1, op_val, op_val]
|
||||||
|
|
||||||
fig = plt.gcf()
|
fig = plt.gcf()
|
||||||
|
|
||||||
@ -69,21 +69,26 @@ def animate_carry_count(
|
|||||||
extent=[-center[0], dims - center[0], dims - center[1], -center[1]], # type: ignore
|
extent=[-center[0], dims - center[0], dims - center[1], -center[1]], # type: ignore
|
||||||
)
|
)
|
||||||
def init():
|
def init():
|
||||||
plt.title(f"{title[0]}")
|
plt.title(f"{state[0]}")
|
||||||
image.set_clim(0, carry.overflow - 1)
|
image.set_clim(0, carry.overflow - 1)
|
||||||
fig.tight_layout()
|
fig.tight_layout()
|
||||||
|
|
||||||
@animate(fig, frames, interval=interval, init_func=init)
|
@animate(fig, frames, interval=interval, init_func=init)
|
||||||
def ret(_):
|
def ret(_):
|
||||||
plt.title(f"{title[0]}")
|
title, op_val, old_op_val = state
|
||||||
|
plt.title(f"{title}")
|
||||||
image.set_data(expansion)
|
image.set_data(expansion)
|
||||||
fig.tight_layout()
|
fig.tight_layout()
|
||||||
|
|
||||||
next_func(expansion)
|
next_func(expansion, val=op_val)
|
||||||
if operation == "add":
|
if operation == "add":
|
||||||
title[0] += op_val
|
state[0] += op_val
|
||||||
else:
|
elif operation == "multiply":
|
||||||
title[0] *= op_val
|
state[0] *= op_val
|
||||||
|
elif operation == "log":
|
||||||
|
state[0] += op_val
|
||||||
|
if state[0] >= op_val * old_op_val * old_op_val:
|
||||||
|
state[1] *= old_op_val
|
||||||
|
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
|
|||||||
@ -1,4 +1,6 @@
|
|||||||
from sympy.abc import x, y
|
from sympy.abc import x, y
|
||||||
|
import sympy
|
||||||
|
from sympy.polys.polytools import degree
|
||||||
import numpy as np
|
import numpy as np
|
||||||
|
|
||||||
from .carry import Carry
|
from .carry import Carry
|
||||||
@ -38,6 +40,43 @@ def poly_from_array(
|
|||||||
return ret
|
return ret
|
||||||
|
|
||||||
|
|
||||||
|
def poly_to_array(
|
||||||
|
poly: sympy.Expr,
|
||||||
|
alloc: np.ndarray | None = None,
|
||||||
|
x_var=x,
|
||||||
|
y_var=y
|
||||||
|
) -> np.ndarray:
|
||||||
|
'''Convert a polynomial of 2 variables to a 2D array'''
|
||||||
|
if isinstance(poly, (int, sympy.core.numbers.Zero)):
|
||||||
|
if alloc is None:
|
||||||
|
alloc = np.zeros((1, 1), dtype=np.int32)
|
||||||
|
alloc[0,0] = int(poly)
|
||||||
|
return alloc
|
||||||
|
alloc.fill(0)
|
||||||
|
alloc[0,0] = int(poly)
|
||||||
|
return alloc
|
||||||
|
|
||||||
|
coeffs = list(sorted(
|
||||||
|
map(
|
||||||
|
lambda z: (z, (degree(z[0], x_var), degree(z[0], y_var))), # type: ignore
|
||||||
|
poly.as_coefficients_dict().items()
|
||||||
|
),
|
||||||
|
key=lambda z: sum(z[1])
|
||||||
|
))
|
||||||
|
|
||||||
|
max_x, max_y = coeffs[-1][1]
|
||||||
|
if alloc is None:
|
||||||
|
alloc = np.zeros((max_x + max_y + 1, max_x + max_y + 1), dtype=np.int32)
|
||||||
|
elif alloc.shape[0] < (max_x + 1) or alloc.shape[1] < (max_y + 1):
|
||||||
|
raise ValueError("return array has insufficient size")
|
||||||
|
else:
|
||||||
|
alloc.fill(0)
|
||||||
|
|
||||||
|
for (_, coeff), (x_deg, y_deg) in coeffs:
|
||||||
|
alloc[y_deg, x_deg] = coeff
|
||||||
|
return alloc
|
||||||
|
|
||||||
|
|
||||||
def _first_nonzero(arr: np.ndarray, axis: int):
|
def _first_nonzero(arr: np.ndarray, axis: int):
|
||||||
"""
|
"""
|
||||||
Find the index of the first nonzero entry of `arr` along `axis`.
|
Find the index of the first nonzero entry of `arr` along `axis`.
|
||||||
|
|||||||
@ -5,7 +5,7 @@ format:
|
|||||||
html:
|
html:
|
||||||
html-math-method: katex
|
html-math-method: katex
|
||||||
date: "2021-02-23"
|
date: "2021-02-23"
|
||||||
date-modified: "2025-2-20"
|
date-modified: "2025-02-20"
|
||||||
jupyter: python3
|
jupyter: python3
|
||||||
categories:
|
categories:
|
||||||
- algebra
|
- algebra
|
||||||
|
|||||||
1
polycount/cell2/.gitignore
vendored
Normal file
1
polycount/cell2/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
*.mp4
|
||||||
1
polycount/cell2/carry2d
Symbolic link
1
polycount/cell2/carry2d
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
../cell1/carry2d
|
||||||
BIN
polycount/cell2/collinear_carries.png
Normal file
BIN
polycount/cell2/collinear_carries.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 14 KiB |
BIN
polycount/cell2/first_implicit.png
Normal file
BIN
polycount/cell2/first_implicit.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 19 KiB |
File diff suppressed because it is too large
Load Diff
BIN
polycount/cell2/polyproduct.png
Normal file
BIN
polycount/cell2/polyproduct.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 11 KiB |
Loading…
x
Reference in New Issue
Block a user