Carl Love

Carl Love

28010 Reputation

25 Badges

12 years, 290 days
Himself
Wayland, Massachusetts, United States
My name was formerly Carl Devore.

MaplePrimes Activity


These are answers submitted by Carl Love

Since the series is alternating, I decided to pair consecutive terms to make it a series of positive terms:

restart
:

a:= k-> (-1)^(k+1)/((10*k+(-1)^k-5)/4);

proc (k) options operator, arrow; (-1)^(k+1)/((5/2)*k+(1/4)*(-1)^k-5/4) end proc

simplify(a(k)+a(k+1)) assuming k::odd;

12/(25*k^2-9)

sum(subs(k= 2*k-1, %), k= 1..infinity);

(1/5)*Pi*cot((1/5)*Pi)

 

Download AltSum.mw

I don't know why my output doesn't display the normal way. It looks normal in the worksheet. I tried creating-from-scratch and uploading the worksheet 3 times.

It can be done by applying a small command to the plot after the VennDiagram command:

V:= VennDiagram(...): #exact same command that you had before

(`&<`, `&>`, `&[`):= (curry, rcurry, ()-> index &> args):
fl:= s-> (thisproc(s):= try parse(s[..-2]) catch: s end try):

subsindets(
    V,
    And(string, "%" &under &[(-1), float &under fl),
    sprintf &< "%4.1f%%" @ fl
);


 

The Answer by @dharr is missing the partial-fractions aspect. The Answer by @nm doesn't reduce the results mod 11 after the partial fractions are obtained. The following code takes care of both of those issues.

restart:

`mod/Fullparfrac`:= proc(rf, p)
local d:= Factor(denom(rf)) mod p;
    if not d::`*` then return rf fi;
    add(Normal([op](convert(numer(rf)/d, parfrac))) mod p)
end proc
:

Fullparfrac(1/(x^9+x^6-x+1)) mod 11;

(3*x+6)/(x^2+4*x+9)+(5*x+1)/(x^2+1)+(3*x^4+4*x^3+6*x^2+5*x+4)/(x^5+7*x^4+6*x^3+2*x^2+5*x+5)

 

 

Download ModParfrac.mw

Maple's series data structure does not allow for an order (O(...)) term when the low-order terms are already an exact representation of the function. You'd get the same thing from the series command:

series(x, x= 0)

If for some syntactic reason you need the series data structure and order term, you could do

series(sol + x^Order, x= 0)

The messages that you're getting from mint are neither warnings nor complaints, nor are they labeled as such; they are just information. When you see a message such as

  • These names were used as global names but were not declared:  A

it is up to you to decide whether A has been used appropriately. The purpose of showing you those messages is that they'd also be shown if A had been a misspelling (of, for example, a). How else could mint be able to tell you about possibly misspelled global names?

Do not declare names as global inside a procedure or module unless you intend to allow the possibility that they be changed within that procedure or module. It is dangerous to do so because then you will not be warned if you unintentionally make assignments to those names. 

Maple has two types of command procedures: library and builtin. The Answer by @nm showed how to use the LibraryTools package to browse the library commands. Library commands are written in the Maple language. The builtin commands are not written in Maple; rather, they are implemented directly in the kernel (a.k.a. "engine"). They tend to be basic and very efficiently implemented commands. 

Many writers here, including some who are quite experienced, use the adjective "builtin" (or the more grammatically correct "built-in") to refer to any of the many 1000s of commands that come pre-installed with Maple, including those in the Library. It's understandable simply from an English-language perspective why they'd use "builtin" or "built-in'" that way; however, that usage is completely contrary to Maple documentation, where builtin refers strictly to the few hundred commands shown below.

restart
:

#Every builtin command procedure has an index number corresponding to it.
#In this first example, we use 400 as index. The procedure can be constructed
#from the number like this:
#
P:= proc() option builtin= 400; end proc;

proc () option builtin = numer; end proc

#So we see that the command's name is `numer` (the numerator extractor).
#The only purpose of constructing the procedure is to get that name.
#If the name is known, that's all that's needed to invoke the command:
#
numer(x/y);

x

#A slightly easier (but more obtuse) way to construct the procedure
#from the index number is
#
k:= 400:
P:= subsop(3= (builtin= k), ()-> ());

proc () option builtin = numer; end proc

#It's slightly easier because the k can be a variable, as immediately above.
#Operand 3 of any procedure is its option sequence, even if that's
#NULL. ()-> () is just the simplest possible procedure, equivalent to
#proc() end proc
#
#Let's try a number that's not an index to a builtin command:
#
k:= 200:
PX:= subsop(3= (builtin= k), ()-> ());

Warning, (in anonymous procedure) not a built-in function (`200`)

proc () end proc

#We see that PX remains the trivial procedure.
#
#I'd rather not get those warnings, because there'll be hundreds of
#them if I don't suppress them.
#
WL:= interface(warnlevel= 0) #Suppress all warnings
:

#All builtins that I've found have numbers between 200 and 700, and
#they are all packed into 2 subranges of that: 203..466 and 544..647
#(in Maple 2023). I extended the range that I
#checked to -1024..1024 to be sure that there weren't any more. Of
#course, I can't be absolutely certain that there are none outside
#that range.
#
#The string index [26..-11] extracts the name (whatever is between = and ;)
#from the string-form of the procedure (as generated by the %A format):
#
sprintf("%A", eval(P));
%[26..-11];
cat(``, %);

"proc () option builtin = numer; end proc"

"numer"

numer

#So here is the list of builtins in Maple 2023. This code runs in a quarter second on
#my computer. I get 368 of them in Maple 2023 and 373 in Maple 2025.
#
Bs:= [
    for k from -1024 to 1024 do
        P:= subsop(3= (builtin= k), ()-> ());
        if eval(P) = (()-> ()) then next k fi;
        [cat(``, sprintf("%A", eval(P))[26..-11]), k]
    od
]:
sort(index~(Bs, 1), key= String); #alphabetic order

[ASSERT, AppendFeatureInterface, Array, ArrayOptions, ArrayToolsInterface, Base64BMPToImage, Base64JPEGToImage, Base64PNGToImage, CacheInterface, CodeToolsInterface, ConstructColumn, ConstructRow, CopySign, DEBUG, Default0, DefaultOverflow, DefaultUnderflow, ERROR, EqualEntries, EqualStructure, FromInert, GetKeywordParameterSymbols, GridInterface, HFloat_ADD, HFloat_AiryAi, HFloat_AiryBi, HFloat_BesselI, HFloat_BesselJ, HFloat_BesselK, HFloat_BesselY, HFloat_DIV, HFloat_Dirac, HFloat_EQ, HFloat_GAMMA, HFloat_GE, HFloat_GT, HFloat_HankelH1, HFloat_HankelH2, HFloat_Heaviside, HFloat_Im, HFloat_LE, HFloat_LT, HFloat_LambertW, HFloat_MUL, HFloat_NE, HFloat_POW, HFloat_Re, HFloat_SUB, HFloat_abs, HFloat_arccos, HFloat_arccosh, HFloat_arccot, HFloat_arccoth, HFloat_arccsc, HFloat_arccsch, HFloat_arcsec, HFloat_arcsech, HFloat_arcsin, HFloat_arcsinh, HFloat_arctan, HFloat_arctanh, HFloat_argument, HFloat_binomial, HFloat_ceil, HFloat_conjugate, HFloat_cos, HFloat_cosh, HFloat_cot, HFloat_coth, HFloat_csc, HFloat_csch, HFloat_csgn, HFloat_erf, HFloat_erfc, HFloat_exp, HFloat_factorial, HFloat_floor, HFloat_frac, HFloat_ln, HFloat_lnGAMMA, HFloat_log, HFloat_log10, HFloat_log2, HFloat_round, HFloat_sec, HFloat_sech, HFloat_signum, HFloat_sin, HFloat_sinh, HFloat_sqrt, HFloat_surd, HFloat_tan, HFloat_tanh, HFloat_trunc, Im, ImageToBase64PNG, MPFloat, MorrBrilCull, MultiThreadInterface, NameSpace, NextAfter, NumericClass, NumericEvent, NumericEventHandler, NumericStatus, Object, OrderedNE, PlotInfo, PythonInterface, RETURN, RPolyInterface, RandNumberInterface, Re, Record, RememberTableInterface, SDMPolynom, SFloatExponent, SFloatMantissa, Scale10, Scale2, SearchText, SecurityInterface, String, TRACE, ToInert, Unordered, UpdateSource, _UIUtils_Interface, _UIUtils_ToDotm, _error, _hackwareToPointer, _jvm, _local, _maplet, _mint, _savelib, _treeMatch, _unify, _xml, `\`$\``, `\`**\``, `\`*=\``, `\`*\``, `\`++\``, `\`+=\``, `\`+\``, `\`,=\``, `\`--\``, `\`-=\``, `\`..\``, `\`.=\``, `\`/=\``, `\`::\``, `\`<=\``, `\`<>\``, `\`<\``, `\`=\``, `\`>=\``, `\`>\``, `\`?()\``, `\`?[]\``, `\`[]\``, `\`^=\``, `\`^\``, `\`and=\``, `\`and\``, `\`done\``, `\`evalf/hypergeom/kernel\``, `\`if\``, `\`implies=\``, `\`implies\``, `\`int/series\``, `\`intersect=\``, `\`intersect\``, `\`kernel/transpose\``, `\`minus=\``, `\`minus\``, `\`mod=\``, `\`not\``, `\`or=\``, `\`or\``, `\`quit\``, `\`stop\``, `\`subset\``, `\`union=\``, `\`union\``, `\`xor=\``, `\`xor\``, `\`{}\``, `\`||=\``, `\`||\``, `\`~\``, abs, add, addressof, alias, anames, andmap, andseq, appendto, array, assemble, assign, assigned, attributes, bind, binomial_GMP, builtin_RTableScan, builtin_dot, call_external, callback, cat, coeff, coeffs, conjugate, convert, crinterp, debuggerMemberLookup, debugopts, define_external, degree, denom, diff, disassemble, divide, dlclose, entries, eval, evalb, evalf, evalgf1, evalhf, evalindets, evaln, expand, exports, factorial, factorial_GMP, frem, frontend, gc, genpoly, gmp_isprime, goto, has, hastype, hfarray, icontent, ifelse, igcd, ilcm, ilog10, ilog2, indets, indices, inner, integerdivq2exp, integermul2exp, iolib, iquo, iratrecon, irem, isOverloadProc, is_gmp, isqrt, kernelopts, lcoeff, ldegree, length, lexorder, lhs, localGridInterfaceRun, lowerbound, lprint, macro, map, map2, mapletoiris, max, maxnorm, member, membertype, min, modp, modp1, modp2, mods, mul, mvMultiply, negate, nops, normal, numboccur, numelems, numer, op, order, ormap, orseq, overload, parse, piecewise, pointto, print, prtprepro, readlib, reduce_opr, refresh_libname, remove, rhs, rtable, rtableInfo, rtable_convolution, rtable_eval, rtable_histogram, rtable_indfns, rtable_is_zero, rtable_normalize_index, rtable_num_dims, rtable_num_elems, rtable_options, rtable_redim, rtable_rotate, rtable_scale, rtable_scanblock, rtable_size, rtable_sort_indices, rtable_zip, savelib, sdmpoly, searchtext, select, selectremove, seq, series, setattribute, sign, sort, ssystem, streamcall, subs, subsindets, subsop, substring, system, table, taylor, tcoeff, time, timelimit, traperror, trunc, type, typematch, typepolykernels, unames, unassign, unbind, upperbound, userinfo, whattype, writeto, xormap, xorseq, zip, `~Array`, `~Matrix`, `~Vector`]

nops(Bs);  #count

368

#It's a Good Programming Practice to reset sessionwide settings to their
#previous values:
#
interface(warnlevel= WL):

 

Download AllBuiltins.mw

Your idea to use subsindets was the right idea! However, I don't think that MapleTA:-Builtin:-decimal(2, ...does quite what you want; replace it with evalf[2]. Also, replace float with complex(float). If you want, you can operate on all of ans at once by making it [ans]. Summarizing all that, make the command

P1:= subsindets([ans], complex(float), evalf[2]);

The resulting expression should only be used to enhance human readability of the display. Use the original for any further computation.

All of your results can be explained by basic complex arithmetic. There is no significance to your use of ln(x); it could be replaced by a generic complex variable and you'd get analogous results. Maple is not doing anything special or unusual here.

For any complex z and positive integer n, it is always true that (z^(1/n))^n = z; however, it's not always true that (z^n)^(1/n) = z; indeed, that's not even necessarily true for real z < 0. Try z = -1n = 3. This explains why your f(3) and f(1/3) are different when you have no assumptions.

Here, I'm addressing your newer expression A, but the simplification process is essentially the same as for the expression in your original Question. Hence, this Answer is essentially the same as Kitonum's, only applied to your new expression.

A:= -797250051*((-(1284505600*a^2*sin(phi)^(7/2))/797250051 +
   (1284505600*a^2*sin(phi)^(3/2))/265750017)*cos(phi)^(5/2) - 
   (1284505600*a^2*sin(phi)^(3/2)*cos(phi)^(9/2))/265750017)*2^(1/4) *
   sqrt(cos(phi)^(5/2)/sin(2*phi)^(5/2)) /
   (2569011200*sin(phi)^(1/4)*cos(phi)^(5/2)*x^2)
:

I guessed that the variable ts that you had in one place was a typo meant to be phi.

Your large integers do not add any complexity or difficulty for simplify to this; they only make the expression harder to read.

You used the assumption phi>0. Your desired simplified form is not valid under that assumption. You can test with phi=4 to verify that. The assumption sin(phi) >= 0 is sufficient. When simplifying trig functions whose arguments have coefficients, such as sin(2*phi), it's necessary to use expand.

I recommend against using simplify(..., symbolic) unless absolutely necessary. Its simplifications are not always valid, as is clearly stated on its help page.

 AS:= simplify(expand(A)) assuming sin(phi) >= 0;
                                      2  2
                              sin(phi)  a 
                      AS := - ------------
                                     2    
                                  2 x     

Here is a breadth-first-search procedure for it. If one wanted to find all k-cycles containing u, breadth first is certainly faster than depth first. To find only one such cycle (if it exists), perhaps depth first would be faster. My procedure constructs only the (k-1)-paths (not walks) that start with u, then completes to k-cycles those that can be completed.

(* 
Returns all k-cycles in G containing the vertex vx.
Works for all graphs, including directed and those with self-loops.
Undirected cycles are represented twice in the output, once for
each direction of transversal.

Option truefalse can be specified if one only wants to know whether
some k-cycle containing vx exists without displaying the cycles.
*)
kCycles:= proc(vx, k::posint, G::Graph, {truefalse::truefalse:= false})
option Author= `Carl Love <carl.j.love@gmail.com> 2025-Apr-22`;
local (V,E):= op(op~([3,4], G)), v, u, C, c;
    if not member(vx,V,v) then error "vertex %1 does not exist", vx fi;
    C:= [[v]];   
    to k-1 do
        C:= [seq](seq([c[],u], u= E[c[-1]] minus {c[]}), c= C)            
    until C=[];
    if truefalse then orseq(v in E[c[k]], c= C)
    else [for c in C do if v in E[c[k]] then V[c] fi od]
    fi
end proc
: 
#Examples:
G:= GraphTheory:-SpecialGraphs:-PetersenGraph():
kCycles(1, 5, G);
    [[1, 2, 3, 4, 5], [1, 2, 3, 7, 6], [1, 2, 9, 8, 5], 
      [1, 2, 9, 10, 6], [1, 5, 4, 3, 2], [1, 5, 4, 10, 6], 
      [1, 5, 8, 7, 6], [1, 5, 8, 9, 2], [1, 6, 7, 3, 2], 
      [1, 6, 7, 8, 5], [1, 6, 10, 4, 5], [1, 6, 10, 9, 2]]

G:= GraphTheory:-CompleteGraph(14):
C:= CodeTools:-Usage(kCycles(1,6,G)):
memory used=42.10MiB, alloc change=2.36MiB,
cpu time=687.00ms, real time=599.00ms, gc time=218.75ms

nops(C) = (14-1)!/(14-6)!;
                        154440 = 154440

CodeTools:-Usage(kCycles(1,6,G,truefalse));
memory used=23.25MiB, alloc change=-1.18MiB,
cpu time=406.00ms, real time=348.00ms, gc time=156.25ms

                              true

 

You asked:

  • Also, is there a way to disable the use of remember tables permanently in Maple?

[Disclaimer: I don't claim that you'll achieve any benefit from using the code below. Rather, I provide this code so that you can easily, safely, and reversibly explore the possibility that you asked for above.]

I think that I have below something better than what you asked for. You can permanently, yet reversibly, remove options remember and cache from all Library procedures that have them. This will prevent the accumulation of new data in remember or cache tables when that accumulation is caused by the option remember or option cache mechanism. It doesn't affect direct assignments to the tables as in

f(3):= 7;

where f is a procedure. It affects only Library procedures; it doesn't prevent you from using the options in your own code. It doesn't remove the default initial remember or cache tables which commands have stored in the Library (which would be a very bad thing to do!). The only cost of using this procedure is a one-time use of 30 seconds of time, and permanent storage of 1.6M of files to hold the modified procedures. Once that's done, the new procedures are used by doing restart and updating libname. To return to the original procedures, just use restart.

Permanent, yet reversible, removal of options remember and cache from the Maple library

 Author: Carl Love <carl.j.love@gmail.com> 2025-Apr-1

 

Disclaimers:

1. 

I don't advocate such removal. Rather, my goal here is to show how it can be safely and quickly done in a way that is very easy reversible, thus making this safe and easy for those who want to explore it.

2. 

We remove those options from the Library procedures that have them by default. This is not the same thing as removing any existing remember tables or caches. And these latter things I definitely wouldn't recommend anyway.

3. 

If a command creates a procedure on the fly that has those options, this process will not prevent that; nor do I think that there would be any benefit to doing that.

 

restart
:

#So that we can verify later that this works, here's a Library procedure
#with option remember:
op(3, eval(`simplify/do`));

remember, system, `Copyright (c) 2000 Waterloo Maple Inc. All rights reserved.`

The command LibraryTools:-ShowContents() returns a list or lists. Each member list contains info about 1 name stored in the Library. The first field in each entry is a string form of the name with ".m" appended. The other fields aren't used here. So, for example, if the Library contained only `simplify/do`, then the list of lists might look like

L:= [["simplify/do.m", "other stuff"]]:

So the list of names can be extracted like this:

P:= [seq](cat(``, P[1][..-3]), P= L);

[`simplify/do`]

Any procedure has a 3rd operand that stores the expression sequence of its options, even if that sequence is NULL.

opts:= [op](3, eval(P[]));

[remember, system, `Copyright (c) 2000 Waterloo Maple Inc. All rights reserved.`]

The option is removed by substituting NULL for it:

assign(P[] = subsop(3= subs(remember= (), opts)[], eval(P[]))):

Check that the procedure now has different options:

 

system, `Copyright (c) 2000 Waterloo Maple Inc. All rights reserved.`

restart
:

Now I put these ideas together into a procedure that does the above for the whole Library:

(*
This procedure finds the procedures in the Library that have option remember
or cache and removes those options. The modified procedures are stored in a
new library in the file directory specified by the parameter LD.

Note that removing these options is not the same thing as removing the
remember table or cache.
*)
RemoveAllRemOpts:= proc(LD::string)
uses LT= LibraryTools;
local
    P, p, Opts:= proc(P) option inline; [op](3, eval(P)) end proc,
    SO:= {'remember', 'cache'}=~ (),
    HO:= {identical(lhs~(SO)[]), specfunc('cache')},
    L:= select(
        n-> n::procedure and membertype(HO, Opts(n)),                
        [seq](cat(``, P[1][..-3]), P= LT:-ShowContents())
    )
;
    LT:-Create(LD, nops(L));
    for P in L do

        if (p:= P::protected) then unprotect(P) fi;
        assign(P= subsop(3= subs[eval](SO, Opts(P))[], eval(P)));
        if p then protect(P) fi;
        savelib(P, LD)
    od;
    return
end proc
:

#An empty directory to store the library:
LibDir:= "C:/Users/carlj/OneDrive/Desktop/MaplePackages/NoRem":
save LibDir, "LibDir.mpl":

CodeTools:-Usage(RemoveAllRemOpts(LibDir));
#All these warnings can be ignored. Indeed, they all refer to names that aren't
#used here anyway because they aren't procedures.
#
#This procedure only takes 30 seconds for me.

Warning, the GPIOTools package is only supported on the Raspberry Pi platform

Warning, grobner is deprecated. Please, use Groebner.

Warning, (in anonymous procedure created in Opts) environment variable `_EnvMaxSplit` declared as a global variable

Warning, (in anonymous procedure created in Opts) environment variable `_EnvIsSqrfree` declared as a global variable

Warning, (in anonymous procedure created in Opts) environment variable `_EnvIsSqrfree` declared as a global variable

Warning, (in anonymous procedure created in Opts) environment variable `_EnvMaxSplit` declared as a global variable

Warning, (in anonymous procedure created in Opts) environment variable `_EnvCharacteristic` declared as a global variable

Warning, (in anonymous procedure created in Opts) environment variable `_EnvP` declared as a global variable

Warning, (in anonymous procedure created in Opts) environment variable `_EnvIsSqrfree` declared as a global variable

Warning, (in anonymous procedure created in Opts) environment variable `_EnvIsSqrfree` declared as a global variable

Warning, (in anonymous procedure created in Opts) environment variable `_EnvD` declared as a global variable

Warning, (in anonymous procedure created in Opts) environment variable `_EnvC` declared as a global variable

memory used=3.09GiB, alloc change=210.01MiB, cpu time=11.98s, real time=30.28s, gc time=609.38ms

Test it

Note that the testing is after a restart.

restart:

read "LibDir.mpl":

The new procedures are used by prepending the new directory name to libname:

libname:= LibDir, libname;

"C:/Users/carlj/OneDrive/Desktop/MaplePackages/NoRem", "C:\Program Files\Maple 2023\lib", "C:\Users\carlj\maple\toolbox\Syrup\lib"

#Check that a procedure that used to have option remember no longer does:
op(3, eval(`simplify/do`));

system, `Copyright (c) 2000 Waterloo Maple Inc. All rights reserved.`

To go back to the original Maple procedures, all that's needed is restart:

restart:

op(3, eval(`simplify/do`));

remember, system, `Copyright (c) 2000 Waterloo Maple Inc. All rights reserved.`

NULL

Download RemoveRemOpts.mw

Yes, in almost all cases worksheets created with a newer version of Maple can be opened and edited and resaved with a version several years old. That part is usually still true even if the worksheet has new features. New programmatic features will not execute correctly and new GUI features will not display correctly, but that usually has no impact on reading, editing, and saving.

The Options dialog is in a weird place now: the bottom right corner of the File menu. Being on the right side of a menu is very weird. And why was it moved from the Tools menu? Tools seemed appropriate, but Options is certainly not a File operation.

I fretted for a long time during the beta testing over not being able to find the Options dialog, but I stumbled upon it last night.

I finally found a help page saying that Options was now on the File menu (without specifying the weird exact location). That page is
?worksheet,managing,preferences. Since that's the16th hit for ?options, it's not very helpful. If I capitalize it (?Options), then the relevant help becomes the 21st entry.

Your system has 2 variables,1 equation, and several inequalities, the number of which is irrelevant. Thus, you can only solve for 1 variable. It could be x or y, but you need to specify which. This will get you the solution (without removing the warning):

solve(Sol union area, {y})

If for some strange reason you actually want a solution containing RootOf, change {y} to {x}.

I believe that the warning comes because of your index= real[2]. The solver is able (at least in this case) to convert the RootOf equation to a polynomial before passing it to SemiAlgebraic, but I guess that it's unable to generate the appropriate inequality constraint that's implied by index= real[2]. Since you mean (I assume) the positive square root of y, that constraint is x >= 1. So, if you replace 

x = RootOf(_Z^2 - y, index= real[2]) + 1

with this equivalent

x = RootOf(_Z^2 - y) + 1, x >= 1

then the warning goes away.

There's no need to go through your entire code to modify all occurences of any command procedure (such as simplify). All you need to do is write a simple wrapper for simplify and name it simplify:

restart:
`simplify/orig`:= eval(simplify):
protect(`simplify/orig`):
unprotect(simplify):
simplify:= proc()
local r:= `simplify/orig`(args);
    forget(simplify, 'forgetpermanent', 'subfunctions', 'reintialize');
    r
end proc:
protect(simplify):

That is the "clobbering" approach that acer mentioned. Here is a more-elegant way:

Simplify:= module()
option package;
export 
    simplify:= proc()  
    local r:= :-simplify(args);
        forget(:-simplify, 'forgetpermanent', 'subfunctions', 'reintialize');
        r
    end proc
;
end module:
with(Simplify);

However, that module-based way will not change fhe way that your existing code works.

Using printlevel is one of the crudest possible debugging tools. Why not just use trace on all procedures whose names begin "simplify", like this?:

`&<`:= curry: `&>`:= rcurry:
((trace @ cat&<`` @ index&>(..-3))~ @ select)(
    type, index~(LibraryTools:-ShowContents(), 1), suffixed("simplify")
);

Your example expression for simplify --- 3*x^3/x + sin(x^2)/4 --- is a bad example because x^3/x is converted to x^2 by automatic simplification which has nothing to do with the simplify command. Thus, the command only sees 3*x^2 + sin(x^2)/4, which is already fully simplified,

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