As a continuation of the experiment, I tried to see what packages are 
missing from emscripten-forge to satisfy all of sage's dependencies 
(see https://github.com/sagemath/sage/pull/41680). Here is the result:
```
error    libmamba Could not solve for environment specs
    The following packages are incompatible
    ├─ 4ti2 =* * does not exist (perhaps a typo or a missing channel);
    ├─ autoconf =* * does not exist (perhaps a typo or a missing channel);
    ├─ automake =* * does not exist (perhaps a typo or a missing channel);
    ├─ bliss =* * does not exist (perhaps a typo or a missing channel);
    ├─ c-compiler =* * does not exist (perhaps a typo or a missing channel);
    ├─ cddlib =* * does not exist (perhaps a typo or a missing channel);
    ├─ cibuildwheel =* * is not installable because it requires
    │  └─ bashlex =* *, which does not exist (perhaps a missing channel);
    ├─ cliquer =* * does not exist (perhaps a typo or a missing channel);
    ├─ cxx-compiler =* * does not exist (perhaps a typo or a missing 
channel);
    ├─ cypari2 >=2.2.1 * does not exist (perhaps a typo or a missing 
channel);
    ├─ ecl =* * does not exist (perhaps a typo or a missing channel);
    ├─ eclib =* * does not exist (perhaps a typo or a missing channel);
    ├─ ecm =* * does not exist (perhaps a typo or a missing channel);
    ├─ fflas-ffpack =* * does not exist (perhaps a typo or a missing 
channel);
    ├─ fortran-compiler =* * does not exist (perhaps a typo or a missing 
channel);
    ├─ fpylll >=0.5.9 * does not exist (perhaps a typo or a missing 
channel);
    ├─ gap-defaults =* * does not exist (perhaps a typo or a missing 
channel);
    ├─ gfan =* * does not exist (perhaps a typo or a missing channel);
    ├─ givaro =* * does not exist (perhaps a typo or a missing channel);
    ├─ iml =* * does not exist (perhaps a typo or a missing channel);
    ├─ ipykernel >=5.2.1 * is not installable because there are no viable 
options
    │  ├─ ipykernel [6.15.0|6.15.1|...|6.29.5] would require
    │  │  └─ psutil =* *, which does not exist (perhaps a missing channel);
    │  ├─ ipykernel [6.30.0|6.30.1|...|7.2.0] would require
    │  │  └─ __win =* *, which is missing on the system;
    │  ├─ ipykernel [6.30.0|6.30.1|...|7.2.0] would require
    │  │  └─ __linux =* *, which is missing on the system;
    │  └─ ipykernel [6.30.0|6.30.1|...|7.2.0] would require
    │     └─ __osx =* *, which is missing on the system;
    ├─ jupyter-sphinx =* * is not installable because there are no viable 
options
    │  ├─ jupyter-sphinx [0.3.2|0.4.0|0.5.3] would require
    │  │  └─ nbconvert >=5.5 * but there are no viable options
    │  │     ├─ nbconvert [6.4.5|6.5.0|...|7.9.2] would require
    │  │     │  └─ nbconvert-pandoc [==6.4.5 pyhd8ed1ab_2|==6.5.0 
pyhd8ed1ab_0|...|==7.9.2 pyhd8ed1ab_0], which requires
    │  │     │     └─ pandoc =* *, which does not exist (perhaps a missing 
channel);
    │  │     ├─ nbconvert [5.5.0|5.6.0] would require
    │  │     │  └─ pandoc >=1.12.1,<3.0.0 *, which does not exist (perhaps 
a missing channel);
    │  │     ├─ nbconvert 5.6.1 would require
    │  │     │  └─ jinja2 >=2.4,<3a0 * but there are no viable options
    │  │     │     ├─ jinja2 [2.10|2.10.1|...|2.11.3] would require
    │  │     │     │  └─ markupsafe >=0.23,<2 *, which does not exist 
(perhaps a missing channel);
    │  │     │     └─ jinja2 2.11.3 would require
    │  │     │        └─ markupsafe >=0.23,<2.1 *, which does not exist 
(perhaps a missing channel);
    │  │     └─ nbconvert 7.0.0 would require
    │  │        └─ lxml <5.2.0a0 *, which does not exist (perhaps a missing 
channel);
    │  ├─ jupyter-sphinx 0.5.3 would require
    │  │  └─ ipykernel >=4.5.1 *, which cannot be installed (as previously 
explained);
    │  └─ jupyter-sphinx [0.2.4|0.3.1|0.3.2] would require
    │     └─ sphinx >=2,<4 *, which requires
    │        └─ docutils >=0.12,<0.17 *, which does not exist (perhaps a 
missing channel);
    ├─ jupyter_client =* * is not installable because there are no viable 
options
    │  ├─ jupyter_client [7.3.2|7.3.3|...|8.6.3] would require
    │  │  └─ pyzmq >=23.0 *, which does not exist (perhaps a missing 
channel);
    │  ├─ jupyter_client [8.7.0|8.8.0] would require
    │  │  └─ pyzmq >=25.0 *, which does not exist (perhaps a missing 
channel);
    │  ├─ jupyter_client [5.2.3|5.2.4|...|7.1.2] would require
    │  │  └─ pyzmq >=13 *, which does not exist (perhaps a missing channel);
    │  └─ jupyter_client [7.2.0|7.2.1|7.2.2|7.3.0|7.3.1] would require
    │     └─ pyzmq >=22.3 *, which does not exist (perhaps a missing 
channel);
    ├─ lcalc =* * does not exist (perhaps a typo or a missing channel);
    ├─ libblas =* *_openblas does not exist (perhaps a typo or a missing 
channel);
    ├─ libbraiding =* * does not exist (perhaps a typo or a missing 
channel);
    ├─ libbrial =* * does not exist (perhaps a typo or a missing channel);
    ├─ libflint =* * does not exist (perhaps a typo or a missing channel);
    ├─ libgd =* * does not exist (perhaps a typo or a missing channel);
    ├─ libhomfly =* * does not exist (perhaps a typo or a missing channel);
    ├─ linbox =* * does not exist (perhaps a typo or a missing channel);
    ├─ lrslib =* * does not exist (perhaps a typo or a missing channel);
    ├─ m4ri =* * does not exist (perhaps a typo or a missing channel);
    ├─ m4rie =* * does not exist (perhaps a typo or a missing channel);
    ├─ maxima <5.48.0 * does not exist (perhaps a typo or a missing 
channel);
    ├─ meson-python =* * is not installable because it requires
    │  └─ ninja =* *, which does not exist (perhaps a missing channel);
    ├─ meson =* * is not installable because it requires
    │  └─ ninja >=1.8.2 *, which does not exist (perhaps a missing channel);
    ├─ mpfi =* * does not exist (perhaps a typo or a missing channel);
    ├─ nauty =* * does not exist (perhaps a typo or a missing channel);
    ├─ ninja =* * does not exist (perhaps a typo or a missing channel);
    ├─ ntl =* * does not exist (perhaps a typo or a missing channel);
    ├─ palp =* * does not exist (perhaps a typo or a missing channel);
    ├─ pari =* * does not exist (perhaps a typo or a missing channel);
    ├─ pkg-config =* * does not exist (perhaps a typo or a missing channel);
    ├─ pkgconfig =* * is not installable because it requires
    │  └─ pkg-config =* *, which does not exist (perhaps a missing channel);
    ├─ planarity =* * does not exist (perhaps a typo or a missing channel);
    ├─ pplpy >=0.8.6 * does not exist (perhaps a typo or a missing channel);
    ├─ primecount =* * does not exist (perhaps a typo or a missing channel);
    ├─ primecountpy =* * does not exist (perhaps a typo or a missing 
channel);
    ├─ primesieve =* * does not exist (perhaps a typo or a missing channel);
    ├─ pycosat >=0.6.3 * does not exist (perhaps a typo or a missing 
channel);
    ├─ python-lrcalc [=* *|~=2.1 *] does not exist (perhaps a typo or a 
missing channel);
    ├─ python =3.12 * does not exist (perhaps a typo or a missing channel);
    ├─ rpy2 >=3.3 * does not exist (perhaps a typo or a missing channel);
    ├─ ruff =* * does not exist (perhaps a typo or a missing channel);
    ├─ rw =* * does not exist (perhaps a typo or a missing channel);
    ├─ singular =* * does not exist (perhaps a typo or a missing channel);
    ├─ sirocco =* * does not exist (perhaps a typo or a missing channel);
    ├─ sympow =* * does not exist (perhaps a typo or a missing channel);
    ├─ tachyon =* * does not exist (perhaps a typo or a missing channel);
    ├─ ty >=0.0.12 * does not exist (perhaps a typo or a missing channel);
    └─ uv =* * does not exist (perhaps a typo or a missing channel).
```

Some of them are most likely false negative (eg python, meson-python, 
ninja) and a few others are no hard requirements for us (uv, ruff, jupyter 
stuff, autoconf). The most important ones to attack would be gap, 
ecl/maxima, flint, singular - at least a couple of them already provide 
wasm builds, so adding them to emscripten-forge doesn't seem to be 
impossible. If someone feels motivated to contribute those packages, I 
would join the effort, definitely from the side of the sage build script 
and CI.

On Sunday, February 15, 2026 at 5:47:36 PM UTC+1 parisse wrote:

> On Sunday, February 15, 2026 at 2:22:32 AM UTC+1 [email protected] 
> wrote:
>
> I think this is because WebAssembly-built sympy uses pyodide, which is 
> compiled to wasm directly, so it runs almost natively in your CPU. However, 
> SageMath-in-Browser runs code in the CPU emulated by v86. I think in order 
> to achieve the same performance as WebAssembly-built sympy, SageMath must 
> be compiled directly to wasm using tools like emscripten 
> <https://emscripten.org/index.html>. But that is far more challenging 
> than the current SageMath-in-Browser approach.
>
>  
> CPython can be compiled to wasm by emscripten, therefore you get an 
> acceptable perfomance penalty. For example inverting a 50x50 matrix with 
> integer coefficients in -99..99 takes about 3 seconds on my laptop with 
> sympy live, vs about 1.3 second (native python3 interpreter) vs 0.01s 
> (Giac/Xcas compiled to wasm) vs 0.004s (sage native) or 0.0012s (Giac/Xcas 
> native). But sympy remains Python interpreted code and does not include 
> advanced maths algorithms, so it will be slow except for small inputs.
>

-- 
You received this message because you are subscribed to the Google Groups 
"sage-devel" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion visit 
https://groups.google.com/d/msgid/sage-devel/9ffdb397-d02d-4c8f-9e1d-5e28584b1a7en%40googlegroups.com.

Reply via email to