Skip to content

Commit

Permalink
Modify color palette to follow visible spectrum (red to violet); mino…
Browse files Browse the repository at this point in the history
…r formatting tweaks
  • Loading branch information
klmcwhirter committed Jan 31, 2025
1 parent 201667f commit e68da51
Show file tree
Hide file tree
Showing 6 changed files with 87 additions and 92 deletions.
69 changes: 15 additions & 54 deletions jupyter/sinha_saha.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -141,20 +141,15 @@
"outputs": [
{
"data": {
"image/png": "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",
"text/latex": [
"$\\displaystyle \\left(- \\frac{4}{2 n + 1} + \\frac{1}{n + λ}\\right) {\\left(- n + \\frac{\\left(2 n + 1\\right)^{2}}{4 \\left(n + λ\\right)}\\right)}^{\\left(n - 1\\right)}$"
"$\\displaystyle SinhaSaha=\\sum_{n=1}^{nterms} \\frac{\\left(- \\frac{4}{2 n + 1} + \\frac{1}{n + λ}\\right) {\\left(- n + \\frac{\\left(2 n + 1\\right)^{2}}{4 \\left(n + λ\\right)}\\right)}^{\\left(n - 1\\right)}}{n!} + 4$"
],
"text/plain": [
" ⎛ 2 ⎞\n",
"⎛ 4 1 ⎞ ⎜ (2⋅n + 1) ⎟\n",
"⎜- ─────── + ─────⎟⋅RisingFactorial⎜-n + ──────────, n - 1⎟\n",
"⎝ 2⋅n + 1 n + λ⎠ ⎝ 4⋅(n + λ) ⎠"
"<IPython.core.display.Math object>"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
"output_type": "display_data"
}
],
"source": [
Expand All @@ -166,56 +161,22 @@
"sum_right = (2*n + 1)**2 / (4 * (n + λ)).factor() - n\n",
"\n",
"sum_inner = sum_left_no_factorial * sym.RisingFactorial(sum_right, n-1)\n",
"sum_inner"
"sym_display_latex('sum_inner=', sum_inner)\n",
"\n",
"SinhaSaha = 4 + sym.Sum((1 / sym.factorial(n)) * sum_inner, (n, 1, nterms))\n",
"sym_display_latex('SinhaSaha=', SinhaSaha, display_level=logging.INFO)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"text/latex": [
"$\\displaystyle \\sum_{n=1}^{nterms} \\frac{\\left(- \\frac{4}{2 n + 1} + \\frac{1}{n + λ}\\right) {\\left(- n + \\frac{\\left(2 n + 1\\right)^{2}}{4 \\left(n + λ\\right)}\\right)}^{\\left(n - 1\\right)}}{n!} + 4$"
],
"text/plain": [
"nterms \n",
"_____ \n",
"\n",
" ╲ ⎛ 2 ⎞ \n",
" ╲ ⎛ 4 1 ⎞ ⎜ (2⋅n + 1) ⎟ \n",
" ╲ ⎜- ─────── + ─────⎟⋅RisingFactorial⎜-n + ──────────, n - 1⎟ \n",
" ╱ ⎝ 2⋅n + 1 n + λ⎠ ⎝ 4⋅(n + λ) ⎠ + 4\n",
" ╱ ─────────────────────────────────────────────────────────── \n",
" ╱ n! \n",
"\n",
"‾‾‾‾‾ \n",
"n = 1 "
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# nterms = sym.symbols('nterms', integer=True, positive=True)\n",
"# nterms = sym.oo\n",
"# nterms = sym.Integer(400)\n",
"# nterms = sym.Integer(PREC)\n",
"\n",
"# def reciprocal_factorial(n: int):\n",
"# return 1 / cf.cached_factorial(n)\n",
"\n",
"SinhaSaha = 4 + sym.Sum((1 / sym.factorial(n)) * sum_inner, (n, 1, nterms))\n",
"SinhaSaha"
]
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 39,
"execution_count": 5,
"metadata": {},
"outputs": [
{
Expand Down Expand Up @@ -2971,7 +2932,7 @@
""
]
},
"execution_count": 39,
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
Expand Down Expand Up @@ -3000,7 +2961,7 @@
},
{
"cell_type": "code",
"execution_count": 40,
"execution_count": 6,
"metadata": {},
"outputs": [
{
Expand Down Expand Up @@ -3039,7 +3000,7 @@
"↪ 79227968925892354201995611"
]
},
"execution_count": 40,
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
Expand All @@ -3054,7 +3015,7 @@
},
{
"cell_type": "code",
"execution_count": 46,
"execution_count": 7,
"metadata": {},
"outputs": [
{
Expand Down
52 changes: 43 additions & 9 deletions pi_py/algo/sinha_saha.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,27 +3,58 @@
'''
import logging

import sympy as sym
from mpmath import mp
from mpmath.ctx_mp_python import mpf as mpf_type

from pi_py.algo.decorator import PiAlgoGenerator, pi_digits_generator
from pi_py.algo.mpmath_executor import mpmath_generator_executor

N_TERMS = [5000, 2300][0]
λ_VAL = 575
PREC = [711, 500][0]
N_TERMS = [8_501, 5_000, 2_300][1]
λ_VAL = 575 # DO NOT rename this until no longer using sympy
PREC = [2_000, 711, 500][1]


def _collector(results: list[mpf_type]) -> mpf_type:
return mp.mpf(4.0) + mp.fsum(results)


def sinha_saha_term(n: int) -> mpf_type:
recip_fact = mp.mpf(1.0) / mp.factorial(n)

middle = (mp.mpf(1.0) / (n + λ_VAL)) - (4 / (2*n + 1))

poch_expr = (mp.power(2*n + 1, 2) / (4*(n + λ_VAL))) - n
poch = mp.rf(poch_expr, n - 1)

rc = recip_fact * middle * poch
return rc


@pi_digits_generator
def sinha_saha(*, num_digits: int, terms: int, **kwargs) -> PiAlgoGenerator:
def sinha_saha_mproc(*, num_digits: int, terms: int, **kwargs) -> PiAlgoGenerator:
return mpmath_generator_executor(
terms_worker_func=sinha_saha_term,
num_digits=max(num_digits, PREC)+10,
start=1,
terms=max(terms, N_TERMS),
collector=_collector)


@pi_digits_generator
def sinha_saha_single(*, num_digits: int, terms: int, **kwargs) -> PiAlgoGenerator:
import sympy as sym
n, nterms = sym.symbols('n nterms', integer=True, positive=True)
λ, π = sym.symbols('λ π', real=True)
# SinhaSaha = sym.symbols('SinhaSaha', cls=sym.Function)

sum_left_no_factorial = 1 / (n+λ) - 4 / (2*n + 1)
sum_right = (2*n + 1)**2 / (4 * (n + λ)).factor() - n
recip_factorial = 1 / sym.factorial(n)

sum_inner = sum_left_no_factorial * sym.RisingFactorial(sum_right, n-1)
middle = 1 / (n + λ) - 4 / (2*n + 1)

SinhaSaha = 4 + sym.Sum((1 / sym.factorial(n)) * sum_inner, (n, 1, nterms))
poch_expr = (2*n + 1)**2 / (4 * (n + λ)).factor() - n
poch = sym.RisingFactorial(poch_expr, n - 1)

SinhaSaha = 4 + sym.Sum(recip_factorial * middle * poch, (n, 1, nterms))

SinhaSaha_subs = SinhaSaha.subs({λ: λ_VAL, nterms: N_TERMS}).gammasimp()

Expand All @@ -35,3 +66,6 @@ def sinha_saha(*, num_digits: int, terms: int, **kwargs) -> PiAlgoGenerator:
pi_chars = [pi_parts[0], *pi_parts[2]]

return (int(digit) for digit in pi_chars)


sinha_saha = sinha_saha_mproc
2 changes: 1 addition & 1 deletion pi_ui/src/AppDescription.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ export const AppDescription = (props) => {
};

export const PiHaiku = () => (
<div class='!mb-4 mt-0 mx-4 p-4 rounded-lg text-lg font-semibold bg-stone-50 text-stone-400 shadow-inner shadow-emerald-700'>
<div class='!mb-4 mt-2 mx-4 p-4 rounded-lg text-lg font-semibold bg-stone-50 text-stone-400 shadow-inner shadow-emerald-700'>
<div class='hover:text-emerald-300'>
<p>Three one four.</p>
<p>Pi.</p>
Expand Down
2 changes: 1 addition & 1 deletion pi_ui/src/components.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -205,7 +205,7 @@ export const NavView = (props) => {

<Switch>
<Match when={state() === AppStateEnum.DIGITS}>
<div class='font-semibold'>Select algorithm for which to display digits of pi</div>
<div class='mt-2 font-semibold'>Select algorithm for which to display digits of pi</div>

<CmpSelector signal={piState.digitsAlgo} label="Algorithm:" />

Expand Down
36 changes: 18 additions & 18 deletions pi_ui/src/pi/pi.palette.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,27 +2,27 @@
// purple,violet,blue,lightblue,green,yellow,orange,red,crimson,black

export const pi_palette = [
'bg-purple-700 text-white',
'bg-violet-300',
'bg-blue-700 text-white',
'bg-sky-200',
'bg-green-600 text-white',
'bg-[yellow]',
'bg-orange-400',
'bg-red-700 text-white',
'bg-red-900 text-white', // crimson
'bg-black text-white',
'bg-red-900 text-white', // crimson
'bg-red-700 text-white',
'bg-orange-400',
'bg-[yellow]',
'bg-green-600 text-white',
'bg-sky-200',
'bg-blue-700 text-white',
'bg-violet-300',
'bg-purple-700 text-white',
];

export const pi_shadow_palette = [
'shadow-purple-700/30',
'shadow-violet-300',
'shadow-blue-700/30',
'shadow-sky-200',
'shadow-green-600/30',
'shadow-[yellow]/30',
'shadow-orange-400/30',
'shadow-red-700/30',
'shadow-red-900/30', // crimson
'shadow-black/30',
'shadow-red-900/30', // crimson
'shadow-red-700/30',
'shadow-orange-400/30',
'shadow-[yellow]/30',
'shadow-green-600/30',
'shadow-sky-200',
'shadow-blue-700/30',
'shadow-violet-300',
'shadow-purple-700/30',
];
Loading

0 comments on commit e68da51

Please sign in to comment.