A23 ld turn into the best helpfile for those who don't have a clue ;-) I like the idea, and I have the solution (or something close to more. for 3D-Curve but you can use the plot type Pr-Surface (Parametric surface) for this curve. Press shift-blue and F4 at the same time. You see the PLOT SETUP screen. Enter { 'X*cos(2*PI*X)' 'X*sin(2*PI*X)' 'X') for EQ Now press shift-blue and F2 at the same time. You see the PLOT WINDOW - PR-SURFACE screen. Type the values: X-Left: -1 X-Right: 1 Y-Near: -1 Y-Far: 1 XE: .5 YE:-2 ZE: .5 Step Indep: 15 Depnd: 2 Now press the menu button XXYY (F4) go to input field XXLeft and type the values: XXLeft: 0 XXRight: 1 You can leave the rest unchanged. Press the menu button ERASE (F5) and then DRAW (F6) After some seconds the HP49G draws the curve. Actually it should draw a surface, but because the EQ depends only on X it simply draws the same curve 2 times. (Number of steps for Y (Depnd) is 2) Trying now to answer your first question. For such limits it is generally important to know from what direction (x,y) approaches (0,0). If some dependence y(x) is known, then you can substitude this for y. For example, if it is known that y=x-1 then 2x^2-y^2 2x^2-(x-1)^2 x^2+2*x-1 -------- = -------------- = ------------ x^2+2y^2 x^2+2*(x-1)^2 3*x^2-4*x+2 If no dependence of the two variables is known, then you can parametrize x and y so that they are dependend on the same parameter. Parametrization : x=r*cos(t) y=r*sin(t) Substitude this for x and y in 2x^2-y^2 -------- x^2+2y^2 and use EXPAND to obtain: SIN(t)^2-2*COS(t)^2 - -------------------- 2*SIN(t)^2+COS(t)^2 which already shows that the limit doesn't depend on r (magnitude of the compex (x,y)) but it depends on t, that is the angle or argument of (x,y) = ATAN(y/x). You see that the limit depends on the ratio of y and x, which represents the direction on the x,y-plane from which (0,0) is approached. Now, you can play with different values for t. For example for t=0, the limit is 2. Substitude t=2 and use EXPAND to get this result. Remember that t=2 means that ATAN(y/x)=2 which means that y=TAN(2)*x. Approaching (0,0) from angle t=2 already defines a y=sqrt(3)*x. The limit is then -1/7. You can also plot the expression SIN(t)^2-2*COS(t)^2 - -------------------- 2*SIN(t)^2+COS(t)^2 with independend variable t from 0 to 2*PI and investigate how the limit behaves for different approaches to (0,0). plot. I 19-5. 1st clear all the variables (Y1(X) and any others) then do a RSHold+Y= [add]. enter in an equation. Draw it and then cancel and go back to the stack. Then RSHold+Y= . What shows on my calc is Y1(X). With no equation. When I press [edit] it goes to EQWTR with the Y1(X) highlighted but no = sign. Back to Y=, select [choos] and a popup comes up with the original equation that was stored in Y1(X). Press enter to bring it back. On the screen I get 1st line: Y1(X) Second line Y1(X)= equation. This is different then in Rom 18, I never did get 19-5... FEXTERNAL QAdd :: CK1&Dispatch # FF :: DUPDUP QAdd DUP QAdd QAdd TWO OVER LENHXS SUBHXS ; ; @ 3^1000 : .0566_s 3^5000 : .1221_s This will probably give you ideas on how to improve your ML code.. X Wow! Is there by any chance a possibility that WH, WR, SS, Pivo, etc. would take over the CAS developement now that Parisse is over-occupied with his other CAS-projects? 1) I vote for units back to EQW !!! 2) I vote for Complex Units (mainly for EE) eg. (2.5_V, <) 60_o) + (-120_mV,<)-pi/2_rad) tried it and it's clearly faster then the previous solutions, however, I think that we can go even faster! Consider the following program :: FPTR2 ^Z2BIN (convert to a user hex integer, only 20bits :-( ) bitRS (shift the HXS to the right: division by 2) ; Well, this actually very slow and valid only for small zints, but what I want to say is that all we need is to (somehow) shift the bits of our ZINT to the right and that would do the job for us! (I think we'll have to worry about changing the *length nibble* of our ZINT--do we call so?) I'm not sure about what your program is actually doing, but it seems to me as if you're doing an actual division 'digit by digit'. If I'm wrong then please correct me (by the way, I am at the very first steps in learning ML.. so my understanding is probably wrong..) P.S. I need this program because I'm writing an 'integer square root' function. i.e. Gives the integer part of a number Here is my program :: DUP (N N) FPTR2 ^ZSQRT (A first estimate, if DROP (N X) BEGIN 2DUP FPTR2 ^ZQUOText (N X N/X) OVER FPTR2 ^QAdd (N X N/X+X) ZINT 2 FPTR2 ^ZQUOText (N X Y, division by 2: could be made cheaper!) DUPROT (N Y Y X) FPTR2 ^ZNLT? NOT_UNTIL SWAPDROP ; @ When I replace FPTR2 ^ZQUOText by FPTR2 ^ZDIVext DROP I gain some speed, especially for smallish numbers, and when I use the ML program it is faster than both and very clearly if N is very big. If you use UNBIND in the program then it works: << { '<-A=1' } LOCAL work with <-A UNBIND But indeed, if UNBIND isn't used in the program, then the local vars are there until a warmstart. Hey, let's take advantage of this! We can use it as a generator for hidden variables that are always present, but in no menu. (Store options for you programs there, and use them from everywhere.) It seems that no one is interested in having a faster factorization routin in the HP49!! I hope this is not the case :-) __ Kamel, who wants to factor 2^(2^7)+1 on his HP49G.. Nope! Faster is better! I would like to know where in this enomous ROM (1.19-6) I can find the ASCII chars, and read them in ML. Well, you could do a DO loop with DOERR inside (using hex addresses as an argument) and an IFERR around it to continue, ofcourse to see all the error-messages with DISP That's how I test my FinLib49 Naturally you could gather both the addresses and the messages in a list during the loop without any DISP to view them later... I hopr this is a starting to point to Xplore from global name. I need it for a level editor, of a game coming soon... OK, I load the prolog, and the size, in a register, but then ? In stack level one put 'X=0' for unsigned, 'X=0+0' for right, and 'X=0-0' for left limits. If you needed the limit at 4 from the right, you'd do 'X=4+0'. Provided you've got flag 120 cleared (Silent mode OFF) so that the calc will ask if you want to search for the sign. In a recent thread initiated by Matt Bryant the question was discussed, how the expression xroot(5,5*a^5*b^9*c^13) can be simplified to a*b*c^2*xroot(5,5*b^4*c^3). I suggested to use the command sequence TSIMP EXP2POW EXPAND which returns c^2*b*a*XROOT(5,5)*XROOT(5,c)^3*XROOT(5,b)^4. This is close to the result that Matt wanted to get, but not exactly. So I thought that the command ^|MATCH ( ^| for arrow up ) could be used one or more times to get 5*c^3*b^4 under a single XROOT. But using: 'c^2*b*a*XROOT(5,5)*XROOT(5,c)^3*XROOT(5,b)^4' { 'XROOT(&N,&A)^&n*XROOT(&N,&B)^&m' 'XROOT(&N,&A^&n*&B^&m)' } as arguments for ^|MATCH returns the expression unchanged in stack level 2 and a 0 in stack level 1, to indicate that no match was done. And this though the pattern 'XROOT(&N,&A)^&n*XROOT(&N,&B)^&m' is in the expression! A little bit frustrated I tried manually to rearrange the expression to 'XROOT(5,c)^3*XROOT(5,b)^4*c^2*b*a*XROOT(5,5)' , that is bringing 'XROOT(5,c)^3*XROOT(5,b)^4' to the start of the expression. To my surprice this time using ^|MATCH to 'XROOT(5,c)^3*XROOT(5,b)^4*c^2*b*a*XROOT(5,5)' { 'XROOT(&N,&A)^&n*XROOT(&N,&B)^&m' 'XROOT(&N,&A^&n*&B^&m)' } worked! It returned: 'XROOT(5,c^3*b^4)^3*c^2*b*a*XROOT(5,5)' in level 2 and 1 in level 1. Is this a limitation of the command ^|MATCH ? Does it only find and replace patterns that are at the start of an expression? This would mean that using ^|MATCH repeatedly on c^2*b*a*XROOT(5,5)*XROOT(5,c)^3*XROOT(5,b)^4 to yield the final result 'a*b*c^2*xroot(5,5*b^4*c^3)' would be impossible, because the roots are at the end. Fortunately enough, in this case, the command sequence TSIMP EXP2POW EXPAND FACTOR used on Matt's expression, gives the result XROOT(5,b)^4*XROOT(5,c)^3*XROOT(5,5)*a*b*c^2 which can be matched. :) The following program will give the result that Matt wanted from any (?) expression like xroot(5,5*a^5*b^9*c^13) . << TSIMP EXP2POW EXPAND FACTOR DO { 'XROOT(&N,&A)^&n*XROOT(&N,&B)^&m' 'XROOT(&N,&A^&n*&B^&m)' } ^|MATCH SWAP { 'XROOT(&N,&A)^&n*XROOT(&N,&B)' 'XROOT(&N,&A^&n*&B)' } ^|MATCH ROT OR SWAP { 'XROOT(&N,&A)*XROOT(&N,&B)^&m' 'XROOT(&N,&A*&B^&m)' } ^|MATCH ROT OR SWAP { 'XROOT(&N,&A)*XROOT(&N,&B)' 'XROOT(&N,&A*&B)' } ^|MATCH ROT OR NOT UNTIL END With 'xroot(5,5*a^5*b^9*c^13)' as argument, it returns: 'xroot(5,b^4*c^3*5)*a*b*c^2'. With 'xroot(5,5*a^5*b^9*c^13*d*a^2)' as argument, it returns: 'xroot(5,a^2*b^4*c^3*d*5)*a*b*c^2'. But the question about limitations of the command ^|MATCH (and also v|MATCH) remains. Can someone tell us a little bit more about it? I thought of a better idea a little later, though the program is again farther from Tim's code: then just forget about the h + stuff. The user can just go to the BASE menu (and this isn't so inconvenient thanks to the long form of PREV, where you are returned to the previous menu). I won't to crunch a file for the Hp48 but it is to large for the HP 48 memory . How can I crunch the file on the PC under DOS or Win ??? please tell me if it works and what you think of it thanks. Believe me, we have very good reasons for using MathML. Using algebraic syntax would of course be much easier in terms of authoring, but it is not a universal representation. For example, try to paste an expression from Mathematica into Maple and maple won't understand it. Algebraic syntax might work for trivial things like a x^2 + b x + c, but throw in any non-trivial thing like Hypergeometrics, tensors, or even simple integrals, and you no longer have a universal representation. I am not claiming that MathML is the final solution, but it is certainly the best one we have so far. difference........ of X That's the current TiBORG-way of doing EQW by HP In earlier days the HP remained in the state that USER commands Nowadays the calculator is in charge. :-( Oh - why couldn't the CAS just silently change to radians (internally) and then back to whatever Th User decided when the computing is done ??? (increasing murmuring voice - similar to the Israel people after dwelling 40 years in the deserts of Siinai) Does anyone sell the nice leather zipper cases for HP48s as Educalc did once? The one I have uses velcro to attach the calculator and has slots for expansion cards. Also looking for best place to buy a reliable, new 1 mb expansion card. What is the best brand without paying HP's full price. thanks for your answer and your work. Seems that there are still some features missing, even in the new ROM. But generaly im still quite happy with the calc and it's functionality. with was scalar I am trying to find out where the HOME directory is stored in Memory. I have found heaps of information for the HP48SX regarding pointers to directory positions however (this may sound ignorant) but they do not work on the GX. Does anybody know where I can get a listing for the GX - (not the SX) of all memory access points and what they do? The authoritative reference for all entry points, pointers, memory locations etc. on the SX/GX would be Mika Heiskanen's entries.srt / ent_srtA.pdf documents which can be found at http://www.hpcalc.org/hp48/programming/entries/ . The PDF version is particularly useful. Also useful is the file entries.all found in http://www.hpcalc.org/hp48/programming/entries/entriesx.zip which lists the SX compatible items found in the others plus many additional ones not listed there. ( The descriptions in this one are terse and sometimes nonexistent though. ) The fact that entries.all is for the SX only really isn't an issue because most of the non ram based entry points in the SX rom haven't changed in the lower 256k of the GX rom. ( And if one has you can usually find its new address by searching the rom for the first few instructions. ) Now to deal with your question about how to find the current position of the HOME directory ( USEROB ) on the GX. Here is a short solution in assembly which uses one unsupported entry point ( Jazz syntax from now on ) : CODE LC(5) #80711 * Address of USEROB pointer. GOVLNG =SysPtr@ * Push pointer to stack. ENDCODE If you only want to use supported entry points then here is a longer sys-rpl version : :: CONTEXT@ ( Push address of current directory to the stack. ) SYSCONTEXT ( Switch to home directory. ) CONTEXT@ ( Push address of HOME directory to stack. ) SWAP CONTEXT! ( Restore previous directory. ) ; If you also want information on the structure of directory objects then there are many sources but probably the most prominent ( and well written ) one would be F.H. Gilbert's Introduction to Saturn Assembly Language. ( Second edition. Edited by Eric Rechlin. ) Which can be found at http://www.hpcalc.org/hp48/docs/programming/asm-pdf.zip ( PDF version ) . - HP48s/sx english version : http://www.courbis.com/hp48ml.html - HP48g/gx french version (no english translation sorry) : http://www.courbis.com/voyage48g.html And for oldies : HP28c/cs - french version : http://www.courbis.com/voyage28.html planes will coincide. That's what the zero denominator means. http://home.earthlink.net/~djmp/ A zero denominator indicates that the three normal vectors lie in a common plane and hence that the three planes intersect not in a single point but along an entire line (at least). Is there a way in Mathematica to generate a list of variables in an expression like Variable[]. For example if I passed the expression Sin[x+y]+ z/p - t the list {x,y,z,p,t} would be generated. Another unrelated question is when I use Mathematica V4.0 to calculate tables of ThreeJSymbols the outputs Generally consist of fractions of roots of the form Sqrt[a/b] , c/Sqrt[d] and Sometimes Sqrt[e/f]/g is there a way to force Mathematica always output them in the form Sqrt[h]/i eg instead of it giving Sqrt[2/3] giving Sqrt[6]/3 There are two problems here. Look at the definition of outputstep. ?outputstep Global`outputstep outputstep[datafilename_String][{variablelist_}] := nextstate[{variablelist}] The above definition is interpreted as the expression to be Put. The second problem is that this form of Put interprets datafilename as the actual file name, not a variable. !!datafilename Null This fixes the above problems, but another is still there. The output of outputstep is the input for the next nesting, but the output of PutAppend[x, y] is Null, not x. Instead, outputstep should be ====