MaplePrimes Posts

MaplePrimes Posts are for sharing your experiences, techniques and opinions about Maple, MapleSim and related products, as well as general interests in math and computing.

Latest Post
  • Latest Posts Feed
  • You are hosting a big party tonight and prepared 1000 bottles of wine. A spiteful neighbor sneaks in and poisons exactly one bottle. The poison is colorless, tasteless, and takes about an hour to take effect and kill. Your party also starts in an hour, and you don’t want to throw all the wine away.

    You have 10 mice and time for only one round of tasting. In that round, a mouse can taste from any number of bottles. How can you identify that single poisoned bottle among 1000?

    Pause here and try to solve the problem yourself!

    An obvious solution might be to group the wine into 10 batches of 100 bottles and have each mouse drink from one batch. But if a mouse dies, you have only narrowed it down to 100 bottles, and there is no time for a second round. Whatever test you run, you only get one shot.

    Ten mice. A thousand bottles. The problem sounds impossible – until you realize each mouse isn’t just a taster.

    The exact idea that powers computers is also what solves our wine puzzle.

    A 300-Year-Old Idea

    Some background information before we solve the problem.

    In 1703, Gottfried Leibniz published a paper describing how every number can be written using only two symbols: 0 and 1. To him, the concept felt almost divine – an entire universe created out of nothingness and unity. But for over two centuries, binary remained an idea trapped on paper.

    Everything changed when a young engineer named Claude Shannon realized that 0 and 1 map perfectly onto the physical states of an electrical switch: off and on. That single insight laid the groundwork for digital circuits, eventually powering every smartphone, laptop, and text message on the planet.

    Yet binary is more than just how machines store information. It is a way of extracting information.

    0 and 1 not only reflect the underlying logic of switches, but they also correspond to every yes/no question you ask: “did this mouse die, or not?”. And 10 binary digits can cover 2¹⁰ = 1024 different possibilities.

    1024 is more than 1000.

    The Solution  

    Step 1: Relabel the bottles in binary

    Write each bottle’s number, 1 through 1000, as a 10-digit binary number, padding the front with 0s. For example, bottle 17 is 10001 in binary, so its label becomes 0000010001. Every bottle now carries a unique 10-digit barcode of 0s and 1s.

    Step 2: Assign each mouse a digit

    Line up the mice and assign each one a digit: mouse #1 owns the leftmost digit, mouse #10 the rightmost. Then, run the tasting by the simple rule of a mouse drinks from a bottle if and only if its digit in that bottle’s label is a 1.

    For bottle 17, only mouse #6 and mouse #10 take a sip. No two bottles are sampled by the same combination of mice; each bottle’s binary label is its unique drinking pattern.

    Step 3: Read the answer off the casualties

    Wait an hour. Then, write a 1 in every position with a dead mouse and a 0 otherwise. The string you end up with is the binary label of the poisoned bottle.

    One More Sip

    Before you pop the corks, one last question: was the binary system essential here, or could we have used a different method?

    Here’s a food for thought: suppose your neighbor used a cheaper poison that kicks in 30 minutes instead of an hour, now there is time for a second round of tasting.

    Now each mouse has three possible outcomes instead of two: dies in round 1, dies in round 2, or survives. Binary is the wrong language here; you want base 3.

    The scheme goes as follows. Label the bottles in base 3, give each mouse a digit position, and follow one rule: if digit 1, drink in round 1; if digit 2, drink in round 2; if digit 0, sit out. Each mouse’s fate is its digit on the poisoned bottle’s label.

    The ternary system’s power grows exponentially. Ten mice can now handle 3¹⁰ = 59049 bottles – our 1000 can be covered by seven mice (3⁷ = 2187). Generalized, with r rounds, the whole construction runs in base r+1.

    That is the lesson hidden in the wine cellar. The binary system is more than the foundation of our telecom network, it is also a way of thinking – a reminder that any question, no matter how large, can be answered by a patient sequence of yes and no. You walked into an impossible evening with ten mice and walked out with 999 bottles of perfectly good wine.

    Enjoy the party.

    In late July, the International Congress on Mathematical Software (ICMS 2026) came to the University of Waterloo and Wilfrid Laurier University. Maplesoft had the privilege of sponsoring this year's event, and on the first evening of the conference we opened our Waterloo office for a reception, welcoming around 140 researchers, professors, students, and developers from around the world for an evening of food, demos, and good conversation. Among the many brilliant guests were the ICMS General Chair Bernard Mourrain and Local Organization Chairs Stephen M. Watt and Ilias S. Kotsireas.


    About 30 of us pitched in to organize, demo, and host, turning our office into a packed social hub for the evening. Our CEO, Dr. Laurent Bernardin, opened the evening with some welcome remarks and a talk on math education in the age of AI, tying into the recent launch of the Math Success Platform - a new tool built on Maple to help educators understand where students are struggling and provide more targeted support.

    I, alongside the other co-op students for this term, got the opportunity to volunteer at one of the demo booths, where we showed off the new AI Assistant and Document Import features in Maple 2026, as well as the Maple MCP Server. Two live examples in particular seemed to resonate quite well with our guests...

    The first was a demonstration of the Document Import tool. We brought messy handwritten multivariable calculus notes, outlining limit definitions and squeeze theorem example problems, and scanned them directly into Maple. Within seconds, the handwriting was converted into a functional Maple worksheet, math and all, right down to preserving the hand-drawn graphs. The worksheet was ready to be edited and executed just like anything typed in natively. A skeptical guest even asked us to scan their research papers - written completely in German - just to see the import work in this case as well, and it did, intelligently creating a worksheet with collapsible sections for each individual topic. For a room full of people who spend their careers working with mathematical software, this feature got a reaction every single time.

    The second was Maple's AI assistant, specifically its ability to generate and debug Maple code within the context of your workspace. We loaded a worksheet with a spherical coordinates problem - calculating the volume of the upper half of a sphere with radius 4 - and simply prompted the AI Assistant to create a 3D diagram with interactive sliders to help visualize the problem. Moments later, it had analyzed the sheet and written a working code block for generating a fully interactive 3D visualization, letting guests drag each slider and watch the diagram update in real time across the sphere. It turned an abstract triple integral into something you could physically manipulate and understand, which for a lot of students really helps make these topics click.

    Working the demo booth was a rewarding experience for all of us co-op students, as researchers asked some tough, thought-provoking questions that pushed us to think on our feet and imagine new ways to use the very tools we were demonstrating.
    Beyond the demos, it was also just a great chance to talk with inspiring figures in the world of mathematics - hearing what ambassadors are building with Maple day-to-day, swapping stories with both students and professors on their academic experiences, and getting a glimpse into just how wide and varied the math software community really is. It's not every day that I get to spend time chatting with the people actually shaping the field I'm studying.

    Thank you to the ICMS for bringing the international math software community to our door. It made for one of the most memorable evenings of our time as Maplesoft co-op students!

    Imagine walking into a room full of strangers. At first, everyone seems completely unrelated, with different names, different lives, and different birthdays. As the room gets more crowded, we of course know that sharing similarities with the strangers in the room becomes more likely.

    But just how likely is it that, for example, two people in the room share a birthday?

    The Birthday Paradox asks, more specifically: How many people must be in the room so that it is more likely than not that two people share a birthday?

    Intuitively, we might imagine it must be well over 100 since there are 365 possible birthdays that each stranger can have. Probability, however, has a habit of ignoring our intuition.

    Suppose there are only two people in the room: you, and one stranger. You have your own birthday, so there is a 1/365 ≈ 0.27% chance that the stranger next to you shares your birthday. If we add a third person to the room, we must consider the probability that either of the two strangers share your birthday, or the two strangers share a birthday with each other. This overlap makes our calculations more difficult, and it will only get worse as we add more people.

    Instead, there's a cleaner way to find the solution. Let's find the probability P(n) that no two people share a birthday, then subtract it from 1 to get the probability that two people do share a birthday. Once P(n) < 0.5, then 1 - P(n) > 0.5, meaning at this value of n, there is a greater than 50% chance that two people in the room share a birthday.

    For the case of only two people, there is a 364/365 chance that the second person has a different birthday than the first person. If we introduce a third person, there are 363 unclaimed birthdays left in the year, so a 363/365 chance that the third person's birthday falls on one of these days. Repeating this process for n people in the room, we get:

    If we keep increasing n, we see that the probability P(n) that two people don't share a birthday decreases, meaning the probability 1 - P(n) that they do share a birthday increases.

    Below are some values of 1 - P(n) I found using Maple Learn:

    Based on these calculations, we see that when 23 people are in the room, it is more likely than not that at least two people in the room share a birthday.

    Our question was very specific: we wanted to know what n needed to be in order for the probability of two people sharing a birthday to be > 50%. We found this number to be 23. But, we could extend this question to, say, the probability being 99.9%. This happens when there are 70 people in the room. Consider the animation below to see this visually, where the x-axis represents the number of people n, and the y-axis represents the probability that two people share a birthday, 1 - P(n):

    How many people must be in the room to guarantee that two of them share a birthday? By the shape of the graph above, it may be tempting to think that it is impossible to guarantee this, since the probability seems to asymptotically approach 1. However, we must think through this logically.

    If 365 people were in the room, it is still possible that their birthdays would all fall on a different day (although it's extremely unlikely). But if we have more people than we have available birthdays, we can say at least two people will share a birthday with 100% certainty. That is, P(n) = 0 when n > 365, so our formula for P(n) above is limited to values of n that are 365 or less. This is a basic principle in mathematics called the "pigeonhole principle", which uses the analogy that if we have more pigeons than we have holes to put them in, then at least one of the holes must have at least two pigeons.

    These ideas can be conceptually confusing, but once you go through the mathematical arguments a few times, mentioning the Birthday Paradox in a conversation is a great way to show off your random math knowledge and confuse your peers!

    Attached is an interactive Maple worksheet from Maple's Math Apps gallery if you'd like to investigate the Birthday Paradox further: The_Birthday_Paradox.mw. If you're still interested in more info/applications, see this Maple Primes post by John May.

    The Miracle of Integer Eigenvalues is a paper that shows how any partially-ordered set can be used to generate a matrix with integer eigenvalues.

    R. Kenyon et al, Funct. Anal. Its Appl. 58, 182–194 (2024)  doi: 10.1134/S0016266324020072, arXiv:2401.05291v2

    Here I outline the process and give two examples.

    restart

    PartiallyOrderedSets is after GraphTheory so its DrawGraph gets priority.

    with(GraphTheory); with(LinearAlgebra); with(PartiallyOrderedSets)

    Example (the first example in the paper): Poset in 3 elements with one relation {u < v, {u, v, w}}.

    vars := [u, v, w]; n := nops(vars); rels := {u < v}

    [u, v, w]

    3

    {u < v}

    Some derived things we will need.

    translate := `~`[`=`](vars, [`$`(1 .. n)]); arcs := map(`@`(`[]`, op), rels); A := AdjacencyMatrix(Graph(vars, arcs))

    translate := [u = 1, v = 2, w = 3]

    arcs := {[u, v]}

    Matrix(%id = 36893490746138016812)

    p := PartiallyOrderedSet(vars, A)

    module PosetObject () local numElems::':-integer', height::':-integer', width::':-integer', comparator::procedure, comparatorExists::boolean, transitiveClosure::Matrix, transitiveClosureExists::boolean, transitiveReduction::Matrix, transitiveReductionExists::boolean, elementMap::table, minimalElements::set, minimalElementsExists::boolean, leastElement::':-integer', maximalElements::set, maximalElementsExists::boolean, greatestElement::':-integer', closureGraph::Graph, closureGraphExists::boolean, connectedComponents::(set(set)), connectedComponentsExists::boolean, reductionGraph::Graph, reductionGraphExists::boolean, adjList::Array, adjListExists::boolean, isLattice::boolean, isFaceLattice::boolean, grade::':-integer', isGraded::boolean, isRanked::boolean, rankFuction::procedure, rankTable::Array, rankFuctionExists::boolean; option object; end module

    We can represent this as a directed graph.

    DrawGraph(p, size = [200, 200])

    There are three linear extensions; roughly these are linear orders/chains with all of {u, v, w} that maintain u < v. In this case there are three: u < v and v < w, u < w and w < v, w < u and u < v. In other words, we want to find all permutations of [1,2,3] in which 1 (=u) precedes 2 (=v). We can use the iterator TopologicalSorts, which finds all permutations satisfying some relations.

    T := Iterator:-TopologicalSorts(n, subs(translate, rels))

    _m2598758943744

    The three permutations that have u before v are given below both numerically and symbolically.

    extnums := [seq([seq(t)], `in`(t, T))]; exts := [seq(vars[[seq(t)]], `in`(t, T))]

    [[1, 2, 3], [1, 3, 2], [3, 1, 2]]

    [[u, v, w], [u, w, v], [w, u, v]]

    Choose two of these, P and Q, say the first two.

    Pnum, Qnum := extnums[1 .. 2][]; P, Q := exts[1 .. 2][]

    [1, 2, 3], [1, 3, 2]

    [u, v, w], [u, w, v]

    Then the kth node in Q is a (P,Q) disagreement node or descent node if the k-1th node in Q is greater than the kth node, considered as a relation in P.  For example, for k = 2 (w in Q), so k-1 = 1 (u in Q) then in P we have u < w and w is a (P,Q) agreement node. For k = 3 (v) and k-1 = 2 (w) we have w > v in P and disagreement. The first node in Q is defined to be an agreement node. So u = agree, w = agree, v = disagree. We make a list of agreements (0) and disagreements (1) from k = 2 to k = n and find [0,1].

    As a procedure we have

    eps := proc(P::permlist, Q::permlist)
    local k, i, j, L;
    for k from 2 to nops(Q) do
      member(Q[k-1], P, 'i');
      member(Q[k], P, 'j');
      if i < j then L[k] := 0 else L[k] := 1 end if;
    end do;
    convert(L, list);
    end proc:

    eps(Pnum, Qnum)

    [0, 1]

    So now we do this for all P,Q pairs and fill a 3x3 matrix with a variable indexed with the generated lists

    M := Matrix(nops(extnums), proc (i, j) options operator, arrow; index(a, eps(extnums[i], extnums[j])[]) end proc)

    :=

    And we find this matrix has eigenvalues that are linear combinations of these variables, with integer coefficients

    Eigenvalues(M, output = list)

    [a[0, 0]-a[1, 0], a[0, 0]-a[0, 1], a[0, 0]+a[1, 0]+a[0, 1]]

    And of course if these variables had integer values, the matrix would have all integer eigenvalues.

    inds := indets(M); r := rand(-20 .. 20); M2 := eval(M, `~`[`=`](inds, {seq(r(), 1 .. nops(inds))})); Eigenvalues(M2, output = list)

    M2 :=

    [7, -7, -6]

    Example 2: A poset with the Hasse diagram: (generated below)

    It is convenient to enter only the arcs shown (not b<e)

    vars := [a, b, c, d, e]; n := nops(vars); rels := {a < c, b < c, b < d, d < e}

    [a, b, c, d, e]

    5

    {a < c, b < c, b < d, d < e}

    Specify input = transitivereduction so the missing relation doesn't throw an error.

    translate := `~`[`=`](vars, [`$`(1 .. n)]); arcs := map(`@`(`[]`, op), rels); A := AdjacencyMatrix(Graph(vars, arcs)); p := PartiallyOrderedSet(vars, A, input = transitivereduction)

    translate := [a = 1, b = 2, c = 3, d = 4, e = 5]

    arcs := {[a, c], [b, c], [b, d], [d, e]}

    Matrix(%id = 36893490746159485164)

    module PosetObject () local numElems::':-integer', height::':-integer', width::':-integer', comparator::procedure, comparatorExists::boolean, transitiveClosure::Matrix, transitiveClosureExists::boolean, transitiveReduction::Matrix, transitiveReductionExists::boolean, elementMap::table, minimalElements::set, minimalElementsExists::boolean, leastElement::':-integer', maximalElements::set, maximalElementsExists::boolean, greatestElement::':-integer', closureGraph::Graph, closureGraphExists::boolean, connectedComponents::(set(set)), connectedComponentsExists::boolean, reductionGraph::Graph, reductionGraphExists::boolean, adjList::Array, adjListExists::boolean, isLattice::boolean, isFaceLattice::boolean, grade::':-integer', isGraded::boolean, isRanked::boolean, rankFuction::procedure, rankTable::Array, rankFuctionExists::boolean; option object; end module

    The graph is the transitive reduction (Hasse diagram).

    DrawGraph(p, size = [200, 200])

    Update the relations to include all those in the transitive closure (including b<e)

    Edges(ToGraph(p, reduction = false)); rels := map(`@`(`<`, op), %)

    {[a, c], [b, c], [b, d], [b, e], [d, e]}

    {a < c, b < c, b < d, b < e, d < e}

    Find the 9 linear extensions

    T := Iterator:-TopologicalSorts(n, subs(translate, rels)); extnums := [seq([seq(t)], `in`(t, T))]; exts := [seq(vars[[seq(t)]], `in`(t, T))]

    _m2598743159552

    [[1, 2, 3, 4, 5], [1, 2, 4, 3, 5], [1, 2, 4, 5, 3], [2, 1, 3, 4, 5], [2, 1, 4, 3, 5], [2, 1, 4, 5, 3], [2, 4, 1, 3, 5], [2, 4, 1, 5, 3], [2, 4, 5, 1, 3]]

    [[a, b, c, d, e], [a, b, d, c, e], [a, b, d, e, c], [b, a, c, d, e], [b, a, d, c, e], [b, a, d, e, c], [b, d, a, c, e], [b, d, a, e, c], [b, d, e, a, c]]

    Leading to the matrix

    M := Matrix(nops(extnums), proc (i, j) options operator, arrow; index(a, eps(extnums[i], extnums[j])[]) end proc)

    Matrix(%id = 36893490746138048980)

    The eigenvalues

    Eigenvalues(M, output = list)

    [a[0, 0, 0, 0]-a[0, 0, 1, 0], a[0, 0, 0, 0]-a[0, 0, 1, 0]-a[1, 0, 0, 0]+a[1, 0, 1, 0], a[0, 0, 0, 0]-a[0, 0, 1, 0]+a[1, 0, 0, 0]-a[1, 0, 1, 0], a[0, 0, 0, 0]-a[0, 0, 0, 1]-a[1, 0, 0, 0]+a[1, 0, 0, 1], a[0, 0, 0, 0]-a[0, 0, 0, 1]-a[0, 1, 0, 0]+a[0, 1, 0, 1], a[0, 0, 0, 0]+a[0, 0, 0, 1]-a[0, 1, 0, 0]-a[0, 1, 0, 1], a[0, 0, 0, 0]-a[0, 0, 0, 1]+a[0, 1, 0, 0]-a[0, 1, 0, 1]+a[1, 0, 0, 0]-a[1, 0, 0, 1], a[0, 0, 0, 0]+a[0, 0, 0, 1]+a[0, 0, 1, 0]-a[1, 0, 0, 0]-a[1, 0, 0, 1]-a[1, 0, 1, 0], a[0, 0, 0, 0]+a[0, 0, 0, 1]+2*a[0, 0, 1, 0]+a[0, 1, 0, 0]+a[0, 1, 0, 1]+a[1, 0, 0, 0]+a[1, 0, 0, 1]+a[1, 0, 1, 0]]

    and with some integer entries

    inds := indets(M); M2 := eval(M, `~`[`=`](inds, {seq(r(), 1 .. nops(inds))})); Eigenvalues(M2, output = list)

    M2 :=

    [0, -68, -32, 3, -12, 8, -8, -6, -2]

    NULL

    IntegerEigenvalues.mw

     

    We’ve just launched Maple Flow 2026. And yes, the title of this post doesn’t follow the standard formula for a “new version, new features” announcement.

    But this is not only a post about a new version number and new features.

    It is about a problem engineers know too well: important calculations trapped inside spreadsheets, scripts and old project files - visible only as cell references, code fragments and hidden logic.

    That might be fine when the calculation is being built. It is not fine when the calculation must be reviewed, reused, defended, audited or handed to another engineer.

    Maple Flow is built around a simple idea: engineering calculations should be readable, structured, auditable and easy to share.

    The new release gives engineers better ways to create those calculations, bring existing work into Maple Flow, and turn legacy material into documentation that actually explains the engineering.

    You can now generate Maple Flow worksheets using tools like Codex or Claude Code. This makes it easier to transform ideas into structured technical analyses and turn existing calculations into clear, auditable engineering documents.

    Here are a few ways to use this new integration,

    Rescue calculations from spreadsheets

    Many engineering teams have years - sometimes decades - of calculations sitting in Excel. Those spreadsheets often contain real engineering value, but the logic is fragmented across cells, sheets and references.

    Manually translating all that work into a clearer format can feel like too much effort to even start.

    With Maple Flow 2026 and an AI coding assistant such as Codex or Claude Code, you can use a simple instruction like:

    Convert this Excel spreadsheet to a Maple Flow worksheet

    The AI coding assistant then helps transform spreadsheet logic into a structured Maple Flow worksheet with natural 2D math, clearer variable names and calculations that are visible on the page.

    This is not just file conversion. It is a way to expose the engineering intent hidden inside legacy spreadsheets and make that work easier to understand, extend and review.

    Generate engineering worksheets from a prompt

    The same AI-assisted workflow can also help create a new Maple Flow worksheet from a natural language prompt.

    Ask for a design calculation, describe the engineering context, specify the assumptions and ask for supporting text, equations, plots or diagrams. The result can be a worksheet that already contains readable math, explanations and visual context.

    Stop hiding math in scripts

    Maple Flow 2026 also opens up a practical path for moving useful work out of scripts and into worksheets that communicate the engineering more clearly.

    For example, a Matlab script built around low-level loops, switch/case logic and numerical iteration can be translated into a Maple Flow worksheet that uses higher-level mathematical constructs.

    In one example, a crude while-loop numerical solver became an fsolve call, and switch/case logic became a much more readable piecewise expression.

    The point is not simply to change syntax. It is to move from code that performs a calculation to a worksheet that explains the calculation.

    I've outlined a few ideas that demonstrate how you can use AI coding assistants to generate Maple Flow worksheets. There's much more you can do.

    Of course, this functionality is subject to the same disclaimers as any other AI-generated content:

    • Worksheets are generated by and subject to the limitations of your AI model
    • your mileage may vary
    • and you absolutely need a (human) expert in the loop to check the output.

    But as a starting point, this workflow is seriously powerful.

    Set up your AI coding assistant to generate Maple Flow worksheets with the instructions here.

    Maple Flow 2026 introduces in-worksheet programming, so you can write programs and scripts directly on the canvas and execute them inline with the rest of your worksheet.

    You can enter programs with the keyboard or use the new Programming palette, which inserts common templates such as loops and if/else blocks with the right structure and indentation.

    Productivity features help keep the program readable:

    • automatic closing of procedures, loops and conditionals after the opening line is entered
    • intelligent insertion of statement separators when appropriate
    • automatic indentation to preserve structure and readability

    The existing Code Editor remains the right place for larger scripts. In-worksheet programming is for the logic you want to sit directly beside the math, text and results.

    The Mathcad Migration Assistant has also been updated. It now translates much of the content of Mathcad Prime files into Maple Flow format, in addition to the existing support for Mathcad 13, 14 and 15.


    Because Maple Flow 2026 now supports in-worksheet programming, the updated Migration Assistant also translates Mathcad programs.

    For Mathcad thinking about moving to Maple Flow, the update makes migration faster and more practical. Existing work moves over with more of the structure and intent preserved.

    Worksheets now compute faster! The results depend on the specific calculations, but the improvements can be very noticable - these are selected results from our internal benchmarking suite

    For engineers working with larger or more complex worksheets, that kind of improvement changes the feel of the product.

    Maple Flow 2026 adds more ready-to-use examples to the Application Gallery, including a new Semiconductor section.


    The gallery now includes worksheets semiconductor oxide growth, heat sink sizing, cylindrical fin heat transfer, NMOS threshold voltage, MOSFET power loss, photolithography scanner limits and boron implantation stability.

    Maple Flow 2026 also improves everyday interoperability with Excel. You can now paste more types of data from Excel into Maple Flow, including data formatted as percentages.

    It is a small feature with a practical benefit: less cleanup, fewer interruptions and a smoother path from spreadsheet data to engineering calculation.

    The most important thing about Maple Flow 2026 is not any single feature - it is the direction of travel. Engineering work is becoming more connected. Calculations are moving between spreadsheets, scripts, AI coding assistants, design tools and formal documentation.

    Maple Flow gives those calculations a place where the math is visible, the structure is clear and the result is ready to share.

    So yes, Maple Flow 2026 includes new features. But the bigger story is this: engineers can now move more of their existing work out of hidden logic and into auditable worksheets that communicate the engineering.

    Explore the new features, try the examples and experiment with generating worksheets using AI coding assistants. Grab a trial here.

    Today is Pi approximation day (22/7) and I will use that as an excuse to share my new favourite expression for Pi:

     

    And this isn't even an approximation! Recently, continuous mathematics has found its own equivalent to the digital hardware NAND gate. In his paper “All elementary functions from a single binary operator”, Andrzej Odrzywołek demonstrated that a single functional primitive can generate the entire standard continuous spectrum of operations. In other words, every single button on a scientific calculator, from addition and subtraction to sines, cosines, and logarithms, can be built using just this one function.

    This Maple Worksheet explores how the 'Exp-Minus-Log' ("EML") operator, when paired solely with the constant 1, can be systematically nested to construct basic arithmetic, constants, and complex transcendental functions within Maple.

    In essence, he discovered that the binary operator EML, along with the constant 1, forms a basis for the set of standard scientific-calculator operations.

    This means that functions like sin(x)cos(x) and operations like a-b or a^b can be creating by composing EML with itself in clever ways. Some constants and functions are trivial to represent, such as EML(1,1) = e or EML(x, 1) = exp(x), others however, are not...

    With a quick one-command tweak, you can get Maple to use the property of the extended reals that

    And then with a simple argument about standard branches, you can construct the natural logarithm for real numbers, which immediately leads the constant zero:

     

    You can then expand the tools in your toolbox by creating subtraction with EML, ln(x), and exp(x)

    Which then expands the toolbox further by allowing for the construction unary minus from the constant 0 (since -x = 0 - x), and then addition (since a+b=a-(-b))

    Since we've constructed addition, subtraction, zero and one, we can technically construct every integer! It would not be very pleasant, and by no means optimal... but you could! Here's 7 for example:

    The next step to building all the standard functions is multiplication and inversion. And these use the classic trick by using the fact that x=exp(ln(x)) can help simplify:

    These are compositions of exp, addition, ln, and unary minus (all functions constructed previously), which means they can be made with only EML:

     

    It's at this point that I will leave the derivation of division (a/b) and exponentiation (a^b) as exercises for the reader, so I can skip to something a little more complex...

    To go beyond the basic operators, you'll need to step into the complex domain by constructing the imaginary constant i. To do this, take ln(-1) = -i*Pi (by using the standard branch) and combine it with Euler's formula

    And once again the expression on the left-hand side is made up of operations that were all previously defined, so you can compose EML to get a new constant:

    And finally, it's possible to break down the expression for Pi from the start, since it's the product i*ln(-1)

     

    By successfully extracting the mathematical constants i and Pi, I think this demonstrates the complete constructive capability of the EML operator in the complex domain. While the resulting syntax trees become exponentially deep and unoptimized for human readability, they prove that continuous operations do not require a massive, distinct toolbox. Future applications of this uniform binary structure could dramatically simplify symbolic regression and machine learning optimization models. 
    Ultimately, the EML operator reveals the remarkable truth that the vast complexity of scientific mathematics can be distilled down to a single, beautiful building block.


    Isn't math awesome?

    Hi Maple community, and all,
    an arbitrary arithmetic progression, with starting value , s, 

    and increasing by "a", where "a" is the value to add, every time,
    so
    {Arithmetic Progression} is found by calculating
    s+a*index

    where index is a running index 
    see attached
    arithmetic_progression_with_1_and_8.mw

    arithmetic_progression_with_1_and_8.mw

    hopefully, that is useful, as an example, of an arithmetic progression.

    Regards,
    Matt

    Every four years, the world comes together to watch one of the most anticipated sporting events in history: the FIFA World Cup.

    Behind all the anticipation, venue planning, and media fanfare, there are many artists and researchers who devote themselves to designing a new FIFA World Cup ball to be rolled out for the public eye (pun intended).

    This post presents an overview of the geometric ideas behind the design of the FIFA 2026 "Trionda" ball, using Maple to visualize and explore these concepts in depth. The ideas presented here were inspired by this Scientific American Article. For more information and facts about the 2026 Trionda ball, as well how the shape of the ball impacts play on the pitch, I suggest you check it out!

    FIFA ball designs are often inspired by one of the 5 Platonic solids. A Platonic solid is a convex polyhedron with each face being the same regular polygon with the same number of faces meeting at each corner.

    This year, the Trionda ball was constructed from the simplest of these shapes, the tetrahedron, consisting of 4 triangles, with 3 faces meeting at each corner. Of the five Platonic solids, this shape has the fewest faces, making it the least sphere-like. Turning such a simple polyhedron into a smooth ball is therefore a surprisingly challenging geometric problem.

      

     

    So how can we turn our pointy tetrahedron into something that rolls? Rather than trying to transform the entire tetrahedron at once, we can start by redesigning a single triangular face. The goal is to create a curved triangle that will fit perfectly with three identical copies of itself while covering the surface of a sphere.

     

     
     
    Notice that in the above diagrams, the transformed triangle has the same area as the original triangle. Although the edges have been reshaped, no area is added or removed, only redistributed. Preserving the area ensures that four identical curved panels can still cover the sphere completely without leaving gaps or overlapping.
     
    Now that we know how to change one face of the tetrahedron, we need to perform the same sort of transformation (from a triangle to a curved tile), on the surface of a sphere. To start, we can inscribe the tetrahedron inside the sphere, like this:
    From here, we can project the edges of the tetrahedron onto the sphere, creating six great-circle-arcs (also known as geodesics) as shown in the diagram below.
    Each region enclosed by these geodesics corresponds to one triangular face of the tetrahedron within the sphere. By transforming each geodesic triangle into a smooth curved tile (using a bit of AI help), we create a tiling of the surface similar to that of the 2026 FIFA World Cup ball!
    Because each curved tile maintains the area of the geodesic-generated region, the four panels form a complete tiling of the sphere. 
     
    I would have liked to find a better function between the points on the sphere that resemble the actual Trionda ball more accurately but didn't get the chance to dive into that. If you want to take on the challenge and are successful, please reply in the comments.
     
    To see the Maple Worksheet used to generate these diagrams, check out: Trionda Ball Worksheet

    Hi Maple community and others,

    I'm very proud to present my code.

    Sequences are fun,
    for those who know, about them

    consider Fermat numbers, of the form,
    F(n) = (2^(2^n)) + 1.
    goes like

    3, 5, 17, 257, 65537, 4294967297, 18446744073709551617, 
    340282366920938463463374607431768211457, ...

    in oeis.org database at
    https://oeis.org/A000215 .


    Similarly we can have base 3,

    B(a) = (3^(3^a)) + 1.
    goes like, this,
    4,28,19684, ...
    online, in database, with Universal Resource Location (URL)
    https://oeis.org/A129290

    There could also be base 4, that grows even faster
     

    double_exponential_2_and_3_and_4.mw

    That is all that I have, for now.

    Thank you for this free forum.
    regards,
    Matt

     

    Hi Maple community, and all,

    Here is a little Maple worksheet, shoing an interesting property of prime numbers.

    Numerical evidence supports Andreca's conjecture.

    see    

    _Andricas_conjecture.mw

    good fun

    see, also
    Andrica's Conjecture -- from Wolfram MathWorld
    Enjoy
    regards,
    Matt

    PS online at https://MattAnderson.fun/

    PPS Have a good day, everybody.

    Last week, we launched the Maplesoft Math Success Platform. 
     

    Maplesoft Math Success Platform


    This launch reflects a lot of conversations I’ve had over the past year with educators and institutions about what it means to teach and learn math in the age of AI. 

    At first, many of those conversations were about visibility. If students were completing homework, quizzes, and other assessments with help from AI, those results became harder to interpret. Did students understand the work, or had they copied down a solution that made sense in the moment without building the understanding needed to do something similar on their own?

    That visibility still matters. 

    Over time, though, those conversations led to a more nuanced conclusion. The question is not simply how we prevent students from taking shortcuts. It is how we help them develop the mathematical judgment, intuition, and critical thinking they will need in a world where AI is part of how they learn and work. 

    In some ways, that has become even more important. When answers are easy to generate, students need to be able to test ideas, recognize when something does not make sense, explain their reasoning, and trust their own thinking. 

    That is why I am proud to share the launch of the Maplesoft Math Success Platform. 

    Built on Maple, the platform brings together our math technology and extends it with analytics, AI-driven insights, targeted resources, and content expertise to help institutions support math learning in a more complete way. 

    It gives instructors and learning support teams better insight into where students are struggling, supports the creation of better questions and learning experiences, helps students move beyond the answer, and helps institutions respond to a world where AI is now part of how students practice, study, and get help. 

    You can learn more about the Maplesoft Math Success Platform on our website.

    We also wrote more about the thinking behind this launch in our new whitepaper, Math Education in the Age of AI: From Grading Answers to Understanding Student Progress. It looks at why math education needs a new approach in the age of AI: one that helps instructors ask better questions, create learning experiences that build understanding, and use learning signals to see where students need support.

    Math success in the age of AI requires a new approach

    I’d love to hear what you think. How are you seeing AI change the way students learn, practice, and get help in math? And what kinds of tools or approaches do you think will be most important as math education continues to evolve?

     

    Little bit of a followup on the "Series Solutions of ODEs in Maple" online seminar.

    According to Mathematical Methods for Physicists, 7th Edition by Arfken, Weber and Harris,

    Pages 343-345,

    Singular points are classified as regular or irregular

    Irregular points are called essential singularies.

    They show how to apply these to famous differential equations in Quantum Mechanics and other physical applications (examples given in Farlow's Partial Differential Equations for Scientists and Engineers).

    In Section 12.1 of Mathematical Methods for Physicists, the complex series Laurent expansion (chapter 11 of the book) is applied to generalized to the complex plane (see Saff and Snider Fundamentals of Complex Analysis for Mathematics, Science and Engineering, 2nd Edition).  Not too sure how Maple handles contour integrals though.

    It seems that a regular point is the same as a ordinary point, as per Elementary Differential Equations and Boundary Value Problems, 8th Edition by Boyce and DiPrima, Chapter 5.

    A little while ago, I created a video, Engaging and Enlightening Students with Maple Visualizations, that showed a sample of Maple visualizations that would be helpful in teaching math. Doing that allowed me to get reacquainted with some of Maple's plotting features that I hadn't used for a while. As a result, I made a second instructional video for my Maple tips series, Animating a Polyhedron in Maple

    I chose this topic because I thought it would show several features in Maple that might not be known to all users. I list them below and encourage you to try them out.

    • The plots:-polyhedraplot command allows you to create a 3-D plot of a polyhedron, including one of 138 polyhedra that Maple knows about.

    • The list of named polyhedra available can be obtained by calling the plots:-polyhedra_supported command.

    • The viewpoint option, which allows you to create an animation by varying the viewpoint through a 3D plot, can be used to rotate the polyhedron.

    • Finally, the Export feature allows you to save the plot animation as an animated GIF.

     

    Recently @salim-barzani asked a question about a paper that involved analysing the different types of roots of polynomials. The appendix in that paper gave the example of the roots of x^4+x^2*e[2]+x*e[1]+e[0]using the analysis in Lu et al, "A complete discrimination system for polynomials", Science in China (Ser. E), 39 (1996) 628-646. The analysis uses the discriminant sequence and extensions. Maple provides this through RegularChains:-ParametricSystemTools:-DiscrminantSequence. For example for this polynomial we find there is a real root of multiplicity 2 and a complex conjugate pair when D__2*D__3 < 0 and D__4 = 0 where the D__i are the ith entries in the discriminant sequence [1, -e[2], -2*e[2]^3+8*e[0]*e[2]-9*e[1]^2, 16*e[0]*e[2]^4-4*e[1]^2*e[2]^3-128*e[0]^2*e[2]^2+144*e[0]*e[1]^2*e[2]-27*e[1]^4+256*e[0]^3].

     

    The problem with these conditions is that they are in terms of the D__i and not directly in terms of the e__i parameters. One can derive these conditions and then solve them to find the conditions on the parameters, but Maple has various routines in the RegularChains, RootFinding:-Parametric and SolveTools packages that directly find conditions on parameters to find when there are specified numbers of real or complex roots for polynomial systems. So this post is my attempt to use these tools to find the conditions on the parameters of the above polynomial that give various types of roots. One immediate difficulty is that generally these routines count distinct roots irrespective of multiplicity, and so some indirect analysis is required. There are several different types of commands and analyses that could be used, and my choices here are more to do with my learning experience than an optimum analysis.

     

    The first conclusion is that it is possible, although RealComprehensiveTriangularize did not work as I expected when asking for zero real roots (see cases (a) and (b)) (bug?). Assuming it had worked, RealComprehensiveTriangularize could cover all the cases here, though that will not be true for higher-degree polynomials with more parameters. There doesn't seem to be an obvious systematic way of doing this analysis, which is a downside. Another downside is the large number of subcase conditions, which look as if they could be combined into fewer subcases. CellDecomposition works well for cases without multiplicity.


    Main worksheet [not all is displayed below]:

    Download RootAnalysis4.mw

    restart

    with(RegularChains); with(ParametricSystemTools); with(RootFinding:-Parametric)

    Consider the following polynomial in x with the three real parameters e[0], e[1], e[2]. We would like to know the conditions on these parameters that lead to different numbers of real and complex-conjugate pairs of roots of different multiplicities.

    p := x^4+x^2*e[2]+x*e[1]+e[0]

    x^4+x^2*e[2]+x*e[1]+e[0]

    Consider first how many cases there are. We can set this up as a combinatorial problem in the combstruct package.

    sys := {C = Atom, R = Atom, realrts = Set(multiplereal), rts = Prod(realrts, complexrts), complexpr = Prod(C, C), complexrts = Set(multiplecomplex), multiplecomplex = Sequence(complexpr, card > 0), multiplereal = Sequence(R, card > 0)}

    Draw := proc (q) options operator, arrow; eval(q, {Epsilon = NULL, Prod = `[]`, Set = (proc () options operator, arrow; args end proc), Sequence = `*`}) end proc

    For a degree 4 polynomial there are 9 different cases to consider. Here [C, C] means a (non-real) complex-conjugate pair of roots and R means a real root; the exponents indicate the multiplicities.

    all := combstruct:-allstructs([rts, sys], size = degree(p, x)); nops(%); `~`[Draw](all)

    9

    [[[C, C]^2], [[C, C], [C, C]], [R^2, [C, C]], [R^4], [R, R, [C, C]], [R^2, R^2], [R^3, R], [R, R, R^2], [R, R, R, R]]

    These are (in order)
    (a) A duplicate pair of complex-conjugate roots

    (b) Two distinct pairs of complex-conjugate roots

    (c) A real root of multiplicity 2 and a pair of complex-conjugate roots

    (d) A real root of multiplicity 4

    (e) Two distinct real roots of multiplicity 1 and a complex-conjugate pair

    (f) Two distinct real roots each of multiplicity 2

    (g) A real root of multiplicity 3 and a real root of multiplicity 1

    (h) Three distinct real roots, of multiplicities 2, 1, and 1

    (i) Four distinct real roots of multiplicity 1

    Declare the variables first and parameters last. np is the number of parameters. Use the suggested order.

    vp := SuggestVariableOrder([p = 0], [x]); R := PolynomialRing(vp); np := nops(`minus`({vp[]}, {x}))

    [x, e[0], e[1], e[2]]

    polynomial_ring

    3

    Define derivative polynomials. p2 = 0 when there is a root of multiplicity 2 or more; p3 = 0 when there is a root of multiplicity 3 or more and p4 = 0when there is a root of multiplicity 4.

    p2 := diff(p, x); p3 := diff(p2, x); p4 := diff(p3, x)

    4*x^3+2*x*e[2]+e[1]

    12*x^2+2*e[2]

    24*x

    Discriminant is zero if and only if there are repeated roots.

    Delta := discrim(p, x)

    16*e[0]*e[2]^4-4*e[1]^2*e[2]^3-128*e[0]^2*e[2]^2+144*e[0]*e[1]^2*e[2]-27*e[1]^4+256*e[0]^3

    (d) A real root of multiplicity 4

     

    This is perhaps the simplest case and can be done using RealComprehensiveTriangularize. Specifying np = 3 means use the last 3 variables in the PolynomialRing as parameters. The argument 1 means we want the cases where there is one distinct real root. We specify that all of p, p2, p3, p4 are zero so that the 1 real root is the common root of these polynomials, i.e., is a root on multiplicity 4. (I find the cadcell output a little easier to use, but it is not critical.)

    rct := RealComprehensiveTriangularize({p = 0, p2 = 0, p3 = 0, p4 = 0}, np, R, 1, output = cadcell); Display(rct, R)

    PiecewiseTools:-Is, "Wrong kind of parameters in piecewise"

    This means that the conditions on the parameters to get a single real root of multiplicity 4 are

    conds := Info(rct[2][1][1], R)

    [e[2] = 0, e[1] = 0, e[0] = 0]

    and that the polynomial to solve to find this root under these conditions is

    poly := Info(rct[1][][2], R)

    [x = 0]

    which we can check:

    eval(p, conds); solve(%, x)

    x^4

    0, 0, 0, 0

    (g) A real root of multiplicity 3 and a real root of multiplicity 1

       

    (f) Two distinct real roots each of multiplicity 2

       

    (i) Four distinct real roots of multiplicity 1

       

    (h) Three distinct real roots, of multiplicities 2, 1, and 1

       

    (e) Two distinct real roots of multiplicity 1 and a complex-conjugate pair

       

    (c) A real root of multiplicity 2 and a pair of complex-conjugate roots

       

    (b) Two distinct pairs of complex-conjugate roots

       

    (a) A duplicate pair of complex-conjugate roots

     

    Here we want multiplicity 2 but no real roots. The discriminant is expected to be zero, but in most cases is not.

    rct := RealComprehensiveTriangularize({p = 0, p2 = 0, p3 <> 0, p4 <> 0}, np, R, 0, output = cadcell); nops(rct[2]); Display(rct[2][1 .. 4], R)

    40

    [[PIECEWISE([e[0] < RootOf(256*_Z^3-128*e[2]^2*_Z^2+(16*e[2]^4+144*e[1]^2*e[2])*_Z-4*e[1]^2*e[2]^3-27*e[1]^4, index = real[1]), ``], [e[1] < -(2/9)*(-6*e[2]^3)^(1/2), ``], [e[2] < 0, ``]), []], [PIECEWISE([RootOf(256*_Z^3-128*e[2]^2*_Z^2+(16*e[2]^4+144*e[1]^2*e[2])*_Z-4*e[1]^2*e[2]^3-27*e[1]^4, index = real[1]) < e[0], ``], [e[1] < -(2/9)*(-6*e[2]^3)^(1/2), ``], [e[2] < 0, ``]), []], [PIECEWISE([e[0] < -(1/12)*e[2]^2, ``], [e[1] = -(2/9)*(-6*e[2]^3)^(1/2), ``], [e[2] < 0, ``]), []], [PIECEWISE([e[0] = -(1/12)*e[2]^2, ``], [e[1] = -(2/9)*(-6*e[2]^3)^(1/2), ``], [e[2] < 0, ``]), []]]

    Consider one of the cases with an equality for e[0], suggesting a zero discriminant.
    Find a sample point satisfying the conditions, and see what the roots are like

    j := 37; cell := rct[2][j][1]; conds := Info(cell, R); pts := Info(SamplePoints(cell, R), R)[1]; `~`[is](eval(conds, pts))

    37

    cad_cell

    [0 < e[2], e[1] = 0, e[0] = (1/4)*e[2]^2]

    [e[0] = 1/16, e[1] = 0, e[2] = 1/2]

    [true, true, true]

    We find two complex roots of multiplicity 2, which are complex conjugates, as expected

    eval(p, pts); solve(%, x)

    x^4+(1/2)*x^2+1/16

    (1/2)*I, -(1/2)*I, (1/2)*I, -(1/2)*I

    Check that discriminant is zero.

    eval(Delta, pts)

    0

    But, for example, the first cell does not have the discriminant zero, and does not give a correct result.

    j := 1; cell := rct[2][j][1]; conds := Info(cell, R); pts := Info(SamplePoints(cell, R), R)[1]; `~`[is](eval(conds, pts))

    1

    cad_cell

    [e[2] < 0, e[1] < -(2/9)*(-6*e[2]^3)^(1/2), e[0] < RootOf(256*_Z^3-128*e[2]^2*_Z^2+(16*e[2]^4+144*e[1]^2*e[2])*_Z-4*e[1]^2*e[2]^3-27*e[1]^4, index = real[1])]

    [e[0] = 1/2, e[1] = -3/2, e[2] = -1/2]

    [true, true, true]

    We find a complex conjugate pair and two distinct real roots, which is not expected for this case.

    eval(p, pts); fsolve(%, x, complex)

    x^4-(1/2)*x^2-(3/2)*x+1/2

    -.7473459056-.9001675303*I, -.7473459056+.9001675303*I, .3077440660, 1.186947745

    The discriminant is indeed nonzero.

    eval(Delta, pts)

    -3073/16

    We did not yet find the conditions for this case. We can ask for the conditions for different numbers of complex roots (complex in this context includes real).

    cmplx := ComplexRootClassification([p], np, R)

    [[constructible_set, 1], [constructible_set, 2], [constructible_set, 3], [constructible_set, 4]]

    We are interested in the conditions for exactly two distinct roots, which is found from the second constructible_set. There are two subcases.

    Display(cmplx[2][1], R)

    PIECEWISE([12*e[0]+e[2]^2 = 0, ``], [27*e[1]^2+8*e[2]^3 = 0, ``], [e[2] <> 0, ``]), PIECEWISE([4*e[0]-e[2]^2 = 0, ``], [e[1] = 0, ``], [e[2] <> 0, ``])

    Consider the second case

    case2 := Info(cmplx[2][1], R)[2]

    [[4*e[0]-e[2]^2, e[1]], [e[2]]]

    solve(case2[1], {e[0], e[1]}); q1 := eval(p, %); rts2 := [solve(%, x)]

    {e[0] = (1/4)*e[2]^2, e[1] = 0}

    x^4+x^2*e[2]+(1/4)*e[2]^2

    [(1/2)*(-2*e[2])^(1/2), -(1/2)*(-2*e[2])^(1/2), (1/2)*(-2*e[2])^(1/2), -(1/2)*(-2*e[2])^(1/2)]

    We saw this before when e[2]<0 as case (f) with real roots of multiplicity 2. Now, for e[2]>0 we indeed have two duplicate pairs of complex conjugate roots

    `assuming`([simplify(rts2)], [e[2] > 0])

    [((1/2)*I)*2^(1/2)*e[2]^(1/2), -((1/2)*I)*2^(1/2)*e[2]^(1/2), ((1/2)*I)*2^(1/2)*e[2]^(1/2), -((1/2)*I)*2^(1/2)*e[2]^(1/2)]

    Consider the first case

    case1 := Info(cmplx[2][1], R)[1]

    [[12*e[0]+e[2]^2, 27*e[1]^2+8*e[2]^3], [e[2]]]

    ans1 := {solve(case1[1], {e[0], e[1]}, explicit)}; q11 := eval(p, ans1[1]); rts11 := [solve(%, x, explicit)]

    {{e[0] = -(1/12)*e[2]^2, e[1] = -(2/9)*(-6*e[2])^(1/2)*e[2]}, {e[0] = -(1/12)*e[2]^2, e[1] = (2/9)*(-6*e[2])^(1/2)*e[2]}}

    x^4+x^2*e[2]-(2/9)*x*(-6*e[2])^(1/2)*e[2]-(1/12)*e[2]^2

    [(1/6)*(-6*e[2])^(1/2), (1/6)*(-6*e[2])^(1/2), (1/6)*(-6*e[2])^(1/2), -(1/2)*(-6*e[2])^(1/2)]

    The rts11 subcase polynomial q11 must have real coefficients and therefore only applies for e[2]<0. The roots are real with multiplicity 3 and multiplicity 1 and this case is just case (g) above. The rts12 subcase polynomial q12 (below) also requires e[2]<0 and corresponds to case (g), but with signs reversed.

    q12 := eval(p, ans1[2]); rts12 := [solve(%, x, explicit)]

    x^4+x^2*e[2]+(2/9)*x*(-6*e[2])^(1/2)*e[2]-(1/12)*e[2]^2

    [(1/2)*(-6*e[2])^(1/2), -(1/6)*(-6*e[2])^(1/2), -(1/6)*(-6*e[2])^(1/2), -(1/6)*(-6*e[2])^(1/2)]

    Therefore the rts2 case is the solution for case (a); the cell37 example was a special case of this. In fact if we have a duplicate pair of complex-conjugate roots, the polynomial must be a pefect square, as we see it is

    factor(q1)

    (1/4)*(2*x^2+e[2])^2

    NULL

    Download RootAnalysis5.mw

     

    A note on what I've been working on for the past while. Some of you may have seen the announcement on LinkedIn yesterday; this is for the home audience.

    The question I've been chasing is the one that's underneath the Physics package, the dsolve / pdsolve formal methods and heuristics, the advanced Mathematical Functions and FunctionAdvisor, and most of what I've written for Maple over the years. How can mathematicians and physicists speed up significantly their work using Computer Algebra Systems (CAS) and at the same time trust the result a computer hands back? The new chapter is what happens when AI sits between the human and the CAS, and the answer to that, in my view, turns out to be a much harder problem than the AI hype suggests.

    Why? Because AI is increasingly the driver of computational mathematics in research, engineering, and education. And the unsolved problem isn't whether AI can do mathematics. It can. The problem is that an incorrect AI result arrives with the same confidence as a correct one.

    On 100 challenging problems of undergraduate mathematics we tested, six independent state-of-the-art AIs returned mathematically equivalent answers on only 21% of them, and even within a single AI, repeated runs disagreed with themselves on 3% to 57% of the problems (details). The gap this validation crosses, between probabilistic inference and certified mathematical computation, is epistemological, not technological. It won't close with more training data. It needs validation across multiple AIs and multiple CAS, with no single engine having the final word.

    ExaktAI aims to address that gap. It guides AI through mathematical computation, validates each step against Maple and Mathematica, and automatically generates and opens a corresponding CAS document where the validation can be audited and reproduced for every step, and where one can continue working on the problem. The goal: AI-mathematics that is validated, with the human in the loop.

    ExaktAI is now well developed (TRL 6: System prototype demonstration in a simulated environment, on the ISED / Innovative Solutions Canada TRL scale). At the end an image. A Beta is scheduled for late summer / fall 2026; details at exaktai.ai.

    In summary: ExaktAI is my present, and if you work on AI for mathematics and computer algebra, or the validation problem for AI, I'd love to hear your perspective.



    Edgardo S. Cheb-Terrab
    ExaktAI
    Research Fellow Emeritus at Maplesoft.

    1 2 3 4 5 6 7 Last Page 1 of 311