Services & Resources / Wolfram Forums
-----
 /
MathGroup Archive
1990
*January
*February
*March
*April
*May
*June
*August
*September
*October
*November
*December
*Archive Index
*Ask about this page
*Print this page
*Give us feedback
*Sign up for the Wolfram Insider

MathGroup Archive 1990

[Date Index] [Thread Index] [Author Index]

Search the Archive

Archive5

  • To: mathgroup at yoda.ncsa.uiuc.edu
  • Subject: Archive5
  • From: uunet!lakisis.umd.edu!mbp
  • Date: Mon, 22 Jan 90 12:45:10 EST

   Below is Archive 5.  There are a few short programs which people
submitted with their article, and I didn't bother to extract them
so that they can be separately included in the archives, since they
are not packages.
	--Mark Phillips

[Thanks to Mark for his efforts. --smc]

---cut here------cut here------cut here------cut here------cut here---

Mathematica Notes from sci.math.symbolic, sci.math, and comp.sys.next

Archive 5: 20 November 1989 --- 22 January 1990
 
Editor: Mark Phillips
	mbp at lakisis.umd.edu

Subjects:
			  Mathematica Syntax
		  Postscript output from mathematica
			 Mathematica question
		       Re: Mathematica question
		       Re: Mathematica question
		 Mathematica: Are They Crazy Or Am I?
	       Re: Mathematica: Are They Crazy Or Am I?
	       Re: Mathematica: Are They Crazy Or Am I
	       Re: Mathematica: Are They Crazy Or Am I?
		 Mathematica Wanted / MAC-SE/020/882
	       Re: Mathematica Wanted / MAC-SE/020/882
			parser for Mathematica
		     3x+1 package for Mathematica
	      "Do YOU still do these integrals by hand?"
	     Re: non-commutative algebra in Mathematica?
	   Questions about Mathematica Special Input Forms
	     Re: non-commutative algebra in Mathematica?
	     Re: non-commutative algebra in Mathematica?
		    Simplification in Mathematica
    Making a postscript file from a composite plot in Mathematica
		       factorizing polynomials
			  Fast RLE routines
			    Re: A request
	     Re: non-commutative algebra in Mathematica?
			    Re: A request
			    Re: A request
			RunEncode competition
(*======================================================================*)



From: fateman at renoir.Berkeley.EDU (Richard Fateman)
Subject: Mathematica Syntax
Summary: How is Mathematica syntax defined?
Date: 27 Dec 89 17:49:52 GMT
Newsgroups: sci.math.symbolic

I find Mathematica grammar to be a hodge-podge, and I wonder
if anyone else has found this to be bothersome.  Because neither
the manual (and Roman Maeder's additional book on programming
in Mathematica) have a formal definition of the language
(e.g. in Backus-Naur Form), it is difficult to predict the
acceptability of certain (admittedly marginal) forms.
It is sometimes difficult to predict the structure of those
forms accepted by the system, as well.
My question really is,
Does anyone (presumably at WRI) actually have a complete formal 
grammar definition for Mathematica? (and can it be made public?)

In case you think you think the answer is already in the manual:
The list of "precedences" in the manual are inadequate because
each operator must have left- and right- binding powers, and
the notion that there are only "expressions" and "symbols"
in the language is unsupported by the behavior of the system.
Furthermore, there are just plain errors and omissions in the table.

Reserving for a future time comments on the unpredictability 
of the semantics, let me give just a few examples of the grammar..

Input			Output in FullForm -- comments
1 . 2		Dot[1,2]
1.  2		2.0
1 .2		0.2
1.2.3		--Error-- not Dot[1.2,3]
a.!b.c		Dot[a,Not[Dot[b,c]] -- not? Dot[a,Not[b],c]
a**!b**c	--Error-- not NonCommutativeMultiply[a,Not[NCM[b,c]]]
a>b< c		Inequality[a,Greater,b,Less,c] ... but
a==b>c		Equal[a,Greater[b,c]]  not Inequality[a,Equal,b,Greater,c]
a!*!b		Times[Factorial[a],Not[b]] ... but
a! !b 		Times [Factorial[Factorial[a]],b]
a!!b		Times [Factorial2[a],b]  -- there are lots of oddities with "!"
(a,b,c)		--almost impossible to print out-- it is Segment[a,b,c]
16^^1a		26 ...but
16^^1 a		a
16^^1x		--Error-- not 1*x or x
f[!b]		F[Not[b]] .. but
!b		-- attempts to execute b as shell command

There are many other oddities, some may be merely a lack of conventionality
for someone familiar with Pascal or C, and some are fairly esoteric...

So, to repeat the question: Does anyone have a BNF for Mathematica?
(probably also required: a definition of the lexical structure...)
If so, is it available for public consumption?

By the way, I found some of the problems in the language in the process of
writing a Mathematic scanner/parser, in Common Lisp.

Though I am still tinkering with the program, my hope is to be able to
parse Mathematica programs and libraries independently of Mathematica.
(and to allow others to do so as well)

Richard J. Fateman
fateman at berkeley.edu
(*----------------------------------------------------------------------*)


From: jeremy at math.lsa.umich.edu (Jeremy Teitelbaum)
Subject: Postscript output from mathematica
Date: 29 Dec 89 20:06:50 GMT
Newsgroups: sci.math.symbolic

I would like to include postscript output from Mathematica into
TeX files, using the \special command in TeX.  Has anyone had
any luck with this?  

--
jeremy at math.lsa.umich.edu
Jeremy Teitelbaum			
Math Dept.
U. of Michigan
Ann Arbor, MI  48109
(*----------------------------------------------------------------------*)


From: jesperse at amelia.nas.nasa.gov (Dennis C. Jespersen)
Subject: Mathematica question
Summary: NIntegrate of function defined with Which fails?
Date: 30 Dec 89 00:02:27 GMT
Newsgroups: sci.math.symbolic

This is Mathematica NeXT Release 1.0, Kernel version 1.2, Front end
version 1.2, on a NeXT.

With psi[x_] := Which[0<x && x<=1, 1, True, 0]

I find  Plot[psi[x], {x,-1,2}]   works fine, but

NIntegrate[psi[x], {x,-1,2}]      returns 0;

NIntegrate[psi[x], {x,0,1}]   also returns 0.

With PSI[x_] := Which[x<0,0,x>1,0,True,1] both Plot and NIntegrate
are OK.

With phooey[x_] := Which[x<0,0,x<1,x^2,x<2,-2*x^2+6*x-3,x<3,(3-x)^2,x>3,0],
Plot[phooey[x[], {x,0,3}]      is OK but
NIntegrate[phooey[x], {x,0,3}] gives
       Integrand Null is not numerical at {2.94043}.

So how should one go about defining a function in piecewise form so that
NIntegrate can be successful?

Dennis Jespersen
MS 202A-1
NASA Ames Research Center
Moffett Field, CA 94035
(415)694-6742
jesperse at wk18.nas.nasa.gov
jesperse at amelia.nas.nasa.gov
(*----------------------------------------------------------------------*)


From: moler at simplicity.Stanford.EDU (Cleve Moler)
Subject: Re: Mathematica question
Date: 30 Dec 89 05:43:30 GMT
Newsgroups: sci.math.symbolic

Dennis Jespersen asks about Mathematica: 
> So how should one go about defining a function in piecewise form so that
> NIntegrate can be successful?

One of his examples is:
> phooey[x_] := Which[x<0,0,x<1,x^2,x<2,-2*x^2+6*x-3,x<3,(3-x)^2,x>3,0],

The numerical integrators in MATLAB, "quad" and "quad8", can integrate
this function reliably, but their behavior is interesting.  Consider
integration over the interval [-s, 3+s] for some s >= 0.  This
contains the support interval [0, 3] and so the result should be the
same for all s .  MATLAB does get the right answer (2.0) for any s,
but the amount of work it does can vary considerably.  The two
integrators use adaptive methods based on Simpson's rule and the
8-panel Newton   rule.  They begin by dividing the interval
into subintervals.  If the subdivision points happen to fall at
the break points of Jespersen's piecewise quadratic example,
the rules get the exact answer immediately and terminate quickly.
This happens, for example, with s = 0.5.  But for "most" values
of s, the break points fall within the subintervals, the 
discontinuities in the second derivative are "felt" and many
levels of recursion and subdivision are required to get a
specified accuracy.

By the way, I expressed the function in a manner that allows
it to be evaluated at many points in a vector x :

        function y = phi(x)
        y = (x.^2) .* (0<x) .* (x<=1) + ...
        (-2*x.^2+6*x-3) .* (1<x) .* (x<=2) + ...
        (3-x).^2 .* (2<x) .* (x<=3);

The .* and .^ are MATLAB's notation for element-by-element operations
on vectors.  Although this is still a little cryptic, I find it
easier to read than the Which notation.

  -- Cleve Moler
     The MathWorks
     moler at mathworks.com
     or, na.moler at na-net.stanford.edu
(*----------------------------------------------------------------------*)


From: rivin at Gang-of-Four.Stanford.EDU (Igor Rivin)
Subject: Re: Mathematica question
Date: 30 Dec 89 19:09:58 GMT
Newsgroups: sci.math.symbolic

In article <4365 at amelia.nas.nasa.gov> jesperse at amelia.nas.nasa.gov (Dennis C. Jespersen) writes:
>This is Mathematica NeXT Release 1.0, Kernel version 1.2, Front end
>version 1.2, on a NeXT.
>
>With psi[x_] := Which[0<x && x<=1, 1, True, 0]
>
>I find  Plot[psi[x], {x,-1,2}]   works fine, but
>
>NIntegrate[psi[x], {x,-1,2}]      returns 0;
>
>NIntegrate[psi[x], {x,0,1}]   also returns 0.
>
>With PSI[x_] := Which[x<0,0,x>1,0,True,1] both Plot and NIntegrate
>are OK.
>
>With phooey[x_] := Which[x<0,0,x<1,x^2,x<2,-2*x^2+6*x-3,x<3,(3-x)^2,x>3,0],
>Plot[phooey[x[], {x,0,3}]      is OK but
>NIntegrate[phooey[x], {x,0,3}] gives
>       Integrand Null is not numerical at {2.94043}.
>
>So how should one go about defining a function in piecewise form so that
>NIntegrate can be successful?
>
>Dennis Jespersen
>MS 202A-1
>NASA Ames Research Center
>Moffett Field, CA 94035
>(415)694-6742
>jesperse at wk18.nas.nasa.gov
>jesperse at amelia.nas.nasa.gov

Here is a reply courtesy of Jerry Keiper (the designer of NIntegrate):

The reason 

	phooey[x_] := Which[x<0,0,x<1,x^2,x<2,-2*x^2+6*x-3,x<3,(3-x)^2,x>3,0]

cannot be integrated with NIntegrate[] is that Which[] always evaluates.  The
way to fix this behavior is to allow phooey[] to evaluate only when x_ is
a number. e.g.

In[1]:= phooey[x_?NumberQ] := Which[	x<0, 0,
					x<1, x^2,
					x<2, -2*x^2+6*x-3,
					x<3, (3-x)^2,
					x>3, 0]

Since it is clear where the singularities occur, we can tell NIntegrate[]
to work between them rather than trying to resolve them:

In[2]:= NIntegrate[phooey[x], {x,-5,0,1,2,3,7}]

Out[2]= 2.

In[3]:= %-2

                   -16
Out[3]= -8.88178 10

--
Igor Rivin                                Wolfram Research, Inc.
rivin at Gang-of-Four.Stanford.EDU or
rivin at wri.com
(*----------------------------------------------------------------------*)


From: iphwk at TERRA.OSCS.MONTANA.EDU (Bill Kinnersley)
Subject: Mathematica: Are They Crazy Or Am I?
Date: 1 Jan 90 13:56:44 GMT
Newsgroups: sci.math.symbolic

What am I doing wrong here?

---------------

Mathematica 1.2 (August 30, 1989) [With pre-loaded data]
by S. Wolfram, D. Grayson, R. Maeder, H. Cejtin,
   S. Omohundro, D. Ballman and J. Keiper
with I. Rivin and D. Withoff
Copyright 1988,1989 Wolfram Research Inc.

In[1]:= m*z^2/(p^2+z^2)^(3/2) + z/(p^2+z^2)

               2
            m z           z
Out[1]= ------------ + -------
          2    2 3/2    2    2
        (p  + z )      p  + z

In[2]:= Together[%]

         2        2    3
        p  z + m z  + z
Out[2]= ----------------
            2    2 3/2
          (p  + z )


-- 
--Bill Kinnersley
  Physics Department   Montana State University    Bozeman, MT 59717
  INTERNET: iphwk at terra.oscs.montana.edu      BITNET: IPHWK at MTSUNIX1
226 Transfer complete.
(*----------------------------------------------------------------------*)


From: rivin at Gang-of-Four.Stanford.EDU (Igor Rivin)
Subject: Re: Mathematica: Are They Crazy Or Am I?
Date: 2 Jan 90 20:35:22 GMT
Newsgroups: sci.math.symbolic

In article <9001011356.AA13770 at terra.oscs.montana.edu> iphwk at TERRA.OSCS.MONTANA.EDU (Bill Kinnersley) writes:
>What am I doing wrong here?
>
>---------------
>
>Mathematica 1.2 (August 30, 1989) [With pre-loaded data]
>by S. Wolfram, D. Grayson, R. Maeder, H. Cejtin,
>   S. Omohundro, D. Ballman and J. Keiper
>with I. Rivin and D. Withoff
>Copyright 1988,1989 Wolfram Research Inc.
>
>In[1]:= m*z^2/(p^2+z^2)^(3/2) + z/(p^2+z^2)
>
>               2
>            m z           z
>Out[1]= ------------ + -------
>          2    2 3/2    2    2
>        (p  + z )      p  + z
>
>In[2]:= Together[%]
>
>         2        2    3
>        p  z + m z  + z
>Out[2]= ----------------
>            2    2 3/2
>          (p  + z )
>
>
>-- 
>--Bill Kinnersley
>  Physics Department   Montana State University    Bozeman, MT 59717
>  INTERNET: iphwk at terra.oscs.montana.edu      BITNET: IPHWK at MTSUNIX1
>226 Transfer complete.

You are not doing anything wrong. This is a known bug in Mathematica
1.2. Together command.
There was a maintenance upgrade (which you, apparently, have not
received) which fixed this problem around two months ago. If you send
me (or support at wri.com) the relevant information (your machine type,
registration #, etc) we will send you the upgrade. This also applies to
any other Mathematica user reading this who can duplicate the behavior
exhibited in the included message.

--
Igor Rivin                                Wolfram Research, Inc.
rivin at Gang-of-Four.Stanford.EDU or
rivin at wri.com
(*----------------------------------------------------------------------*)


From: chrstnsn at ux1.cso.uiuc.edu
Subject: Re: Mathematica: Are They Crazy Or Am I
Date: 3 Jan 90 01:40:52 GMT
Newsgroups: sci.math.symbolic

Bill:

I believe that you have run into a bug in an early version of
1.2 that was known and is now fixed:

Mathematica (sun4) 1.2 (November 6, 1989) [With pre-loaded data]
by S. Wolfram, D. Grayson, R. Maeder, H. Cejtin,
   S. Omohundro, D. Ballman and J. Keiper
with I. Rivin and D. Withoff
Copyright 1988,1989 Wolfram Research Inc.
 -- SunView graphics initialized -- 

In[1]:= m*z^2/(p^2+z^2)^(3/2) + z/(p^2+z^2)

               2
            m z           z
Out[1]= ------------ + -------
          2    2 3/2    2    2
        (p  + z )      p  + z

In[2]:= Together[%]

           2           2    2
        m z  + z Sqrt[p  + z ]
Out[2]= ----------------------
               2    2 3/2
             (p  + z )


Steve Christensen
University of Illinois
steve at ncsa.uiuc.edu
(*----------------------------------------------------------------------*)


From: flynn at pixel.cps.msu.edu (Patrick J. Flynn)
Subject: Re: Mathematica: Are They Crazy Or Am I?
Date: 3 Jan 90 12:32:54 GMT
Newsgroups: sci.math.symbolic

In article <1990Jan2.203522.15261 at Neon.Stanford.EDU> rivin at Gang-of-Four.Stanford.EDU (Igor Rivin) writes:
+In article <9001011356.AA13770 at terra.oscs.montana.edu> iphwk at TERRA.OSCS.MONTANA.EDU (Bill Kinnersley) writes:
+>What am I doing wrong here?
+>
+> [description of bug in 1.2 version of Together[] omitted]
+
+You are not doing anything wrong. This is a known bug in Mathematica
+1.2. Together command.
+There was a maintenance upgrade (which you, apparently, have not
+received) which fixed this problem around two months ago. If you send
+me (or support at wri.com) the relevant information (your machine type,
+registration #, etc) we will send you the upgrade. This also applies to
+any other Mathematica user reading this who can duplicate the behavior
+exhibited in the included message.

Does this upgrade policy apply to the 1.2 Mathematica shipped with the
NeXT 1.0 system software?  It does exhibit the bug.  The Release notes
for Mathematica on the NeXT state that registering your copy of
Mathematica "... does not entitle you to free technical support,
updates, or other services from Wolfram Research", and suggests that we
contact NeXT about these issues.

So-
How is this upgrade handled? And by whom (NeXT or Wolfram)?
--
Patrick Flynn, CS, Mich. State U., flynn at cps.msu.edu
(*----------------------------------------------------------------------*)


From: bannon at andromeda.rutgers.edu.rutgers.edu (Ron Bannon)
Subject: Mathematica Wanted / MAC-SE/020/882
Date: 4 Jan 90 17:39:23 GMT
Newsgroups: sci.math.symbolic

			        MATHEMATICA
			        ^^^^^^^^^^^
			          WANTED
			          ^^^^^^
I'm thinking about purchasing Mathematica for my MAC but the price is a
little steep. Is it worth the $700, or is there any way to get it cheaper? 
I plan to use Mathematica on my MAC-SE which has a 68020/68882 Radius
accelerator and 4 MB of RAM. The 4 MB is the maximum configuration and I'm a
little concerned that it may not be enough especially under MultiFinder.

Suggestions will be greatly appreciated.

Thanks 
Ron Bannon
bannon at andromeda.rutgers.edu
bannon at math.rutgers.edu

Ron Bannon
bannon at andromeda.rutgers.edu
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Is George Bush a traitor? Read "October Surprise" by Honegger. Send for details.
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
(*----------------------------------------------------------------------*)


From: fateman at renoir.Berkeley.EDU (Richard Fateman)
Subject: parser for Mathematica
Date: 6 Jan 90 00:22:26 GMT
Newsgroups: sci.math.symbolic

OK, its ready for a few brave souls. If you want to try
a Mathematica (tm) parser written in Common Lisp, I can make
it available to those who can ftp from some computer hereabouts.
I'm not going to send it by tape anywhere.
Respond to me (not to the whole net), and I'll tell you how to
get it.  There are 2 parts: a LaTeX article describing it,
and a Lisp text file, about 30,000 characters.  It would have been
smaller, but I decided to expand out most of the macros so
I could fiddle with borderline cases.
It parses about 50 lines/CPU second on an IBM RT.

Note that this is NOT a interpreter or a pattern matcher
for the internal form that is produced. 

Example of input/output:

f[x_]:=If[x==0,1,x f[x-1]]

(SetDelayed (f (Pattern x (Blank)))
 (If (Equal x (Integer 0)) (Integer 1)
  (Times x (f (Plus x (Times (Integer -1) (Integer 1)))))))

Here's another Mathematica puzzle. What do you get if you type in
f(0,x)
and why is it always equal to f(x,0)?  If you have a Mathematica,
try FullForm[Hold[f(x,0)]] for a hint.

  Richard Fateman
  fateman at renoir.berkeley.edu
(*----------------------------------------------------------------------*)


From: ilan at Gang-of-Four.Stanford.EDU (Ilan Vardi)
Subject: 3x+1 package for Mathematica
Date: 6 Jan 90 07:47:26 GMT
Newsgroups: sci.math.symbolic

(* 
   This Package is a new version of CollatzProblem.m 
   (the "3x+1 problem"). I have used a slightly different 
   definition of Collatz[n] than in the original 
   CollatzProblem.m but it follows the discovery by R. Terras 
   and C. Everett that you should really look at (3x + 1)/2 
   (see J. Lagarias, American Math. Monthly, January 1985). 
   I have also allowed negative values of n. You should be able
   to check the conjecture for any value of n, n <= 2^(10^5). 
   After that I started to run into memory problems. Also, the programs
   runs at least 4 times faster on the development version than in 
   version 1.2. This is probably due to division of large numbers 
   (1000 digits) by small numbers (3 digits) being speeded up. 

   You have to create a table so it may take about 5 minutes
   to read in the file. 

   -Ilan Vardi, January 5, 1990.            *)


Collatz[1] := {1} 

Collatz[-1] := {-1}; Collatz[-5] := {-5}; Collatz[-17] := {-17};

Collatz[n_Integer] := Prepend[Collatz[(3 n +1) / 2], n] /; OddQ[n] 

Collatz[n_Integer] := Prepend[Collatz[n / 2], n] /; EvenQ[n] 


(* The following is a faster version of Collatz[n]   *)

CollatzFaster[n_Integer] := Collatz[n]  /; n < CollatzSmallRange

CollatzFaster[n_Integer] := 
   Block[{cr}, 
          cr = Flatten[Map[NestList[If[EvenQ[#], #/2, (3# + 1)/2]&, 
                           #, CollatzIterateConstant - 1]&,
                           CollatzIterate[n]]]; 
               Join[cr, Rest[Collatz[Last[cr]]]]]


(* CollatzFaster uses this function which lists the k'th Collatz 
   iterates, where k = CollatzIterateConstant (default = 10).   *)

ColllatzIterate[n_Integer] := {}              /; n < CollatzSmallRange

CollatzIterate[n_Integer] := 
   Prepend[CollatzIterate[{n, 1} . 
           CollatzCoefficientListConstant [[1 + 
                Mod[n, CollatzListLength]]]], n] 


(*  The following is a more efficient method of computing how 
    many steps it takes to reach 1 (total stopping time)            *)


CollatzTotalStoppingTime[n_Integer] := Length[Collatz[n]] - 1/;
                                               n < CollatzSmallRange

CollatzTotalStoppingTime[n_Integer] := 
      CollatzIterateConstant + CollatzTotalStoppingTime[{n, 1} . 
       CollatzCoefficientListConstant [[1 + Mod[n, CollatzListLength]]]] 


CollatzTotalStoppingTime[n_Integer] := 
   CollatzLargeIterateConstant + CollatzTotalStoppingTime[
          NestList[Block[
                  {a = CollatzCoefficientListConstant[[1 + 
                        Mod[#[[2]], CollatzListLength] ]]},
                          {SemiProduct[#[[1]], a], 
                         Mod[{#[[2]], 1} . a, CollatzLargeListLength]}] &,
                 {{1, 0}, Mod[n, CollatzLargeListLength]},
                CollatzLargeFactor] [[-1, 1]] . {n, 1}]             /; 
                                            n > CollatzLargeRange

SemiProduct[{a_, b_}, {c_, d_}] := {a c, b c + d}

(* *******************************************************************

The above programs require a table that can be precomputed using 
the following program. 

**********************************************************************)

CollatzCoefficientList[k_Integer] := 
     RotateRight[
         Map[Function[x,  
             {3^Apply[Plus, x] / 2^Length[x], 
              Reverse[x] . 
              Accumulate[#1 #2 &, 1/2 Prepend[3^Reverse[Rest[x]],1]]}],
               Mod[Map[NestList[If[EvenQ[#], #/2, (3 # + 1)/2]&, #, k-1] &,
               Range[1, 2^k]], 2]]]

(***********************************************************************

   Constants: Default for iteration speedup is 10. This seems optimal
   so far.


************************************************************************)


CollatzIterateConstant = 10          

CollatzListLength = 2^CollatzIterateConstant

CollatzCoefficientListConstant = 
               CollatzCoefficientList[CollatzIterateConstant]  

CollatzSmallRange = 2^(CollatzIterateConstant + 1) + 2

CollatzLargeFactor = 100

CollatzLargeIterateConstant = CollatzIterateConstant CollatzLargeFactor

CollatzLargeListLength = 2^(CollatzIterateConstant CollatzLargeFactor)

CollatzLargeRange = Max[2^(CollatzIterateConstant CollatzLargeFactor +2),
                        2^1000]

Off[General::recursion]

$RecursionLimit = Infinity;



(*   Running Times of above  on Dec 3100

lasso [11] collatz> math13
Mathematica (DECstation 3100) 1.3.beta (January 3, 1990) [With pre-loaded data]
by S. Wolfram, D. Grayson, R. Maeder, H. Cejtin,
   S. Omohundro, D. Ballman, and J. Keiper
with I. Rivin, D. Withoff, B. K. Smith, and H.-W. Tam
Copyright 1988,1989,1990 Wolfram Research, Inc.
 -- Terminal graphics initialized -- 

In[1]:= Timing[<<CollatzProblemFaster.m]

Out[1]= {55.5667 Second, Null}

In[2]:= CollatzTotalStoppingTime[2^50 -1]//Timing

Out[2]= {0.383333 Second, 383}

In[3]:= CollatzTotalStoppingTime[2^500 - 1]//Timing

Out[3]= {1.86667 Second, 4331}

In[4]:= CollatzTotalStoppingTime[2^500 + 1]//Timing

Out[4]= {0.983333 Second, 2204}

In[5]:= CollatzTotalStoppingTime[2^5000 - 1]//Timing

Out[5]= {44.8667 Second, 43247}

In[6]:= CollatzTotalStoppingTime[2^50000 - 1]//Timing

Out[6]= {622.767 Second, 428838}

In[7]:= CollatzTotalStoppingTime[2^(10^5) - 1]//Timing

Out[7]= {1563.97 Second, 863323}

*)
(*----------------------------------------------------------------------*)


From: t19 at nikhefh.nikhef.nl (Geert J v Oldenborgh)
Subject: "Do YOU still do these integrals by hand?"
Date: 8 Jan 90 17:56:47 GMT
Newsgroups: sci.math.symbolic

"Do YOU still do these intergals by hand?"

it said in large letters on the Maple and Mathematica adds in our 
(physics) lab.  I decided not to be caught old-fashioned, got myself
an account on a machine with maple and mathematica and tried 
a few integrals which I needed and which take 20 min to 1 hr by hand.
(plus some time to check numerically..)

k = sqrt(x^2-a^2);

int( log((p0*x - p*k)/(p0*x + p*k))/x,x=a..b,continuous);
                                      (I really only need lim(a->0))

Result: Maple thinks a long time, and finally gives back the integral.
Mathematica the same.  (The answer, in the limit a->0, is a set of 5
simple dilogs plus a divergent logarithm).

OK, try again:

int(int(1/(pDp*x^2 + pDq*x*y + qDq*y^2 + pDs*x + qDs*y + sDs - I*eps),
    y=0..x),x=0..1);

in which the limit eps 0-> 0, eps > 0 is understood.  Nothing.  OK, let's
put eps=0 and not care about the imaginary part (which is simple).
Maple: nothing.  Mathematica hangs up the machine.  (The answer is a sum 
of six fairly simple dilogs).  These are the kind of integrals I do
daily.

"Do YOU still do these integrals by hand?"  YES!

Geert Jan van Oldenborgh
working at, but not representing, NIKHEF-H, Amsterdam
(*----------------------------------------------------------------------*)


From: baez at x.ucr.edu (john baez)
Subject: Re: non-commutative algebra in Mathematica?
Date: 9 Jan 90 00:17:41 GMT
Newsgroups: sci.math.symbolic

In article <PALMIERI.89Dec14155157 at m2-225-6.athena.mit.edu> palmieri at m2-225-6.athena.mit.edu (John H Palmieri) writes:
>Does anyone out there know a good way to do non-commutative algebraic
>calculations with, say, Mathematica (on a Sun, in case that matters)?
>(I am particularly interested in the Steenrod algebra, by the way.)
>Thanks.

It's too bad I didn't run into you while I was at MIT over Xmas
(helping Segal with his book on quantum field theory).  I've
used Mathematica to do some calculations in the Weyl algebra 
over a 2-dimensional symplectic space; the main trick is
to use the **  (NonCommutativeMultiply)  operator, and to 
put in relations in such a way that expressions will be 
reduced in the desired direction (taking care to avoid loops).
I never got that far in algebraic topology but if the Steenrod
algebra is associative and easily thought of in terms of 
generators and relations this should work.  Here's all that
was needed in my case:

Unprotect[NonCommutativeMultiply]
q1 ** p1 -> p1 ** q1 + I 
q2 ** p2 -> p2 ** q2 + I 
q1 ** p2 -> p2 ** q1 
q2 ** p1 -> p1 ** q2 
p2 ** p1 -> p1 ** p2 
q2 ** q1 -> q1 ** q2 

 a_ ** (b_ + c_) -> (a ** b) + (a ** c) 
(a_ + b_) ** c_ -> (a ** c) + (b ** c) 

a_ ** b_ :> b a /; NumberQ[b] 
a_ ** b_ :> a b /; NumberQ[a] 
 a_ ** (b_ c_) :>  b (a ** c) /; NumberQ[b] 
(a_ b_) ** c_   :> a (b ** c) /; NumberQ[a] 

a_ ** (b_ + c_) -> (a ** b) + (a ** c) 
(a_ + b_) ** c_ -> (a ** c) + (b ** c) 

I could do calculations that were far too grungy to (want to) do by 
hand, but ran into long run times before I could do all I
wanted to, probably because the above rules, while conceptually
simple, ate up time unnecessarily.  I was too lazy to figure
out how to optimize things; I suspect calculations would go
much faster in a well-written C program, but the point is that
like many mathematicians I find such programming a tiresome 
distraction when trying to prove theorems.
(*----------------------------------------------------------------------*)

 
From: stef at zweig.sun.com (Stephane Payrard)
Subject: Questions about Mathematica Special Input Forms
Date: 9 Jan 90 03:21:59 GMT
Newsgroups: sci.math.symbolic

Is there a function which returns the precedence of a
given operator (in its input form)?

Is there a way for a user to extend the set of Input Forms?

Disclaimers: I am a newcomer to this group, to Mathematica; and English
is not ny mother tongue.

--
--
Stephane Payrard -- stef at sun.com -- (415) 336 3726
Sun Microsystems -- 2550 Garcia Avenue --  M/S 16-40 -- Mountain View  CA 94043
(*----------------------------------------------------------------------*)

From: t19 at nikhefh.nikhef.nl (Geert J v Oldenborgh)
Newsgroups: sci.math.symbolic
Subject: Re: non-commutative algebra in Mathematica?
Date: 9 Jan 90 15:31:19 GMT

In article <PALMIERI.89Dec14155157 at m2-225-6.athena.mit.edu> palmieri at m2-225-6.athena.mit.edu (John H Palmieri) writes:
>>Does anyone out there know a good way to do non-commutative algebraic
>>...

>I've used Mathematica to do some calculations in the Weyl algebra 
>over a 2-dimensional symplectic space; ...

You might want to try FORM, which is very good at these kind of things.  
Noncommuting objects and the linearity properties are built in and you can
sweep out commutators with a loop like

repeat;
	id, p*q = q*p + whatever;
endrepeat;

The program is free and the executables for a dozen computers (including
sun4) and docs can be obtained by anonymous ftp from nikhefh.nikhef.nl.
It is also quite a bit faster than anything else I have used.

Geert Jan van Oldenborgh
NIKHEF-H, Amsterdam.
(*----------------------------------------------------------------------*)


From: t68 at nikhefh.nikhef.nl (Jos Vermaseren)
Newsgroups: sci.math.symbolic
Subject: Re: non-commutative algebra in Mathematica?
Date: 10 Jan 90 10:37:45 GMT

The program FORM can do most of these noncummutative things as
multiplication of functions is default noncummutative.
(You can define commuting functions though). So your objects
happen to be functions without arguments and everything drops
in place. You can make procedures that reduce your expressions
when it suits you, or put some smart reductions at the proper
locations (general reductions have a tendency to blow you out
of the computer).

You can pick up FORM (and a .dvi file of its manual) by means
of anonymous ftp from nikhefh.nikhef.nl (it works already for
many places and the rest should follow rather soon). There are
the following executables:
Apollo DN3000, Apollo DN10000, SUN4/Sparc, Gould 9080, Gould NP1,
DECstation 3100(ultrix), VMS5, ultrix (on regular VAX), Atari-ST,
IBM-PC (had to be pruned a little), MAC, Alliant.
There will be more.
Read the instructions before you print the manual.

Jos Vermaseren
(*----------------------------------------------------------------------*)

From: desouza at math.berkeley.edu (Paulo de Souza)
Newsgroups: sci.math.symbolic
Subject: Simplification in Mathematica
Date: 11 Jan 90 08:55:54 GMT

A question on simplification:

How can one make Mathematica perform simplifications of the type  t^(2r) = -1,
on a series of polynomials computed, where the value of "r" changes during the
execution ?

What I have done is to write the rule in a package, but everytime the value "r"
changes I have to reread it, in order for it to accept the new value in the 
simplifications. I am doing this inside a package where the value of "r" is an
input of one of the functions.

Just for completeness here is the essential part of the code I am using:


BeginPackage["KirMelInvariant`"]
.................................

Unprotect[Power]
Power/: t^(p_) :=  t^(Mod[p,4r]) /; p >= 4r
Power/: t^(p_) :=  t^(-Mod[-p,4r]) /; p <= -4r
Power/: t^(p_) := -t^(Mod[p,2r]) /; p >= 2r
Power/: t^(p_) := -t^(-Mod[-p,2r]) /; p <= -2r
Protect[Power]
....................................

Begin["`Private`"]

KM[p_,q_,r_] :=
         Block[ { a, n, k, BigSum = 0 },
		 a =  ContFract[p, q];
                 n = Length[a];
		 k = Table[1, {n}];
		 LoopFun[1,a,n,r,t];
                 BigSum = Expand[ BigSum ]; 
                 BigSum = Factor[ BigSum ];
                 BigSum
	      ]

End[]
EndPackage[]



Paulo Ney                                              desouza at math.berkeley.edu
(*----------------------------------------------------------------------*)

From: yip at cs.yale.edu (Ken Yip)
Subject: Making a postscript file from a composite plot in Mathematica
Date: 18 Jan 90 07:47:38 GMT
Newsgroups: sci.math.symbolic

On the sun4 version of Mathematica, it is easy to get a postscript 
file from a plot by DISPLAY and psfix.  But what about a plot
that consists of several plots superposed together?  

One reason I want to do this is to annotate a plot with several text strings
(not just labels on axes).  Maybe there are better ways to do this?
Any help??
(*----------------------------------------------------------------------*)


From: arf at maths.warwick.ac.uk (Anthony Iano-Fletcher)
Subject: factorizing polynomials
Date: 17 Jan 90 12:06:05 GMT
Newsgroups: sci.math.symbolic

Can anyone suggest good algorthms for
       (i) factorising polynomials (with integer or
	   real coeficients)
      (ii) finding the hcf of 2 such polynomials.

 At the moment I am using Euclids algorthm for part (ii)
 but this is a little slow.

 Algorthms for (i) must exists since packages like Maple,
 Mathematica etc can do it.

 Also, does anyone know if Maple and Mathematica use efficient 
 algorthms for handling multiple precision integers.

			Thanks in advance,
			Anthony Iano-Fletcher.
--
UUCP:	...!ukc!warwick!arf        Internet: arf at maths.warwick.ac.uk
JANET:	arf at uk.ac.warwick.maths    PHONE:	 +44 203 523523 x2677
(*----------------------------------------------------------------------*)


From: perry at phoenix.Princeton.EDU (Kevin R. Perry)
Subject: Fast RLE routines
Summary: find the fastest mathematica RLE encoder!
Date: 19 Jan 90 16:40:09 GMT
Newsgroups: sci.math.symbolic

At the recent MATHEMATICA conference in beautiful Redwood City, CA,
there was a programming competition; the challenge (for those of
you who weren't there) was to construct "the best" Run-Length encoding
and decoding routines in mathematica.  For example, the RunEncode
function, when given an argument of { 1, 1, 2, 2, 2, 3, 3, 4 }
should return { {1,2}, {2,3}, {3,2}, {4,1} }.  The competition
announcement stated "Entries will be judged on the basis of elegance,
simplicity, and efficiency."  The winning entry certainly deserves
to be noted for it's elegant simplicity; as best I can remember, it was:

RunEncode[{rest___, w:(x_)..}] := 
   Append[ RunEncode[{rest}], {x, Length[{w}]} ]
RunEncode[{}] := {}

But this leaves something to be desired in efficiency, which
is really the most important practical consideration to many of us.

I have also re-constructed a few other competition entries, and decided
to run some timing tests of my own.  I found the results interesting.
I have duplicated these tests on each of SGI 4D/20, NeXT, and MacII,
and I used the built-in Timing[] function to determine speeds, on a
variety of datasets from 1 to 10,000 datapoints in length.

It turns out that the above function is the SLOWEST one I have yet
tried!  So much for the "efficiency" part of the contest!  On
*extremely* easy problems it does a little bit better than the most
inane procedural definition I could think up, but it does horrendously
worse on any reasonably realistic problem, presumably because of the
awesome number of recursive calls it ends up doing.  The speediest
version I have been able to create so far is (oh happy surprise :-) the
function I submitted as an entry to the contest.  [And I didn't even
get an honorable mention! :-( ]

Indeed, though mine is not particularly *simple*, I think
there is a certain practical elegance in it, and it IS extremely
fast - checking it on data of increasing length and complexity,
it quickly attains order-of-magnitude improvements over any
other entry I've been able to re-create from my conference notes.
There were some contenders that I haven't managed to test, and it's
quite possible one of them is the fastest.  I'd like to find out what the
fastest possible routine is, so if you have any hints about methods of
doing it faster, or if anybody out there had a good competition entry,
send me a note so I can try it.  Or compare it yourself first...

For the record, here's my "Most Efficient" run-length encoder:

RunEncode[list_] :=
        ( Transpose[ { list[[#]], # - Drop[ Prepend[#, 0], -1] } ])& [
            Flatten[ Append[ Position[
                  ((Apply[Unequal,#])& /@ Partition[list,2,1]), True
            ], Length[list] ] ] ]
RunEncode[{}] := {}

This guy processes the list Flatten[Table[Table[k, {100}], {k, 100}]]
in about 9 seconds on a 4D/20, compared to 1000 seconds or more for
most methods.  Which says a lot about the care one must take in
designing efficient routines in MATHEMATICA!  A highly functional
approach would appear to often work best, rather than procedural or
even rule-based or syntactic approaches.  This seems to mean applying a
small number of functions directly to an entire list of data, often through
judicious use of Map or Apply, rather than using formulas that iterate
or recurse at a higher level.

"Long Live MATHEMATICA!"

Kevin Perry
CIT-ICGL
Princeton University
<perry at princeton.edu>
(*----------------------------------------------------------------------*)


From: wilkins at jarthur.Claremont.EDU (Mark Wilkins)
Subject: Re: A request
Date: 20 Jan 90 08:24:30 GMT
Newsgroups: sci.math.symbolic

In article <34892 at mips.mips.COM> mark at mips.COM (Mark G. Johnson) writes:

>I would dearly like to know the first 75 or so nonzero
>digits of e to the -2500 power.

1.83567266916215689307725305187314756746974669626209549936356569265433541 
* 10^(-1086)

I got this using Mathematica 1.2 on a Macintosh II, using the command

In[1]:=
  N[E^(-2500),75]

-- Mark Wilkins
   wilkins at jarthur.claremont.edu
(*----------------------------------------------------------------------*)


From: seiford at ecs.umass.edu
Subject: Re: non-commutative algebra in Mathematica?
Date: 18 Jan 90 13:01:25 GMT
Newsgroups: sci.math.symbolic

In article <716 at nikhefh.nikhef.nl>, t19 at nikhefh.nikhef.nl (Geert J v Oldenborgh) writes:
> In article <PALMIERI.89Dec14155157 at m2-225-6.athena.mit.edu> palmieri at m2-225-6.athena.mit.edu (John H Palmieri) writes:
>>>Does anyone out there know a good way to do non-commutative algebraic
>>>...
> 
>>I've used Mathematica to do some calculations in the Weyl algebra 
>>over a 2-dimensional symplectic space; ...
> 
> You might want to try FORM, which is very good at these kind of things.  
> Noncommuting objects and the linearity properties are built in and you can

You should contact Eran Yehudai at Stanford (eran at slacvm.bitnet) who has
implemented several non-commutative algebras in Mathematica and has developed
some general tools.

larry
(*----------------------------------------------------------------------*)


From: stan at valley.UUCP (Stanley L. Kameny)
Subject: Re: A request
Date: 20 Jan 90 08:16:14 GMT
Newsgroups: sci.math.symbolic

In article <3859 at jarthur.Claremont.EDU> wilkins at jarthur.Claremont.EDU
   (Mark Wilkins) writes:
> In article <34892 at mips.mips.COM> mark at mips.COM (Mark G. Johnson) writes:
> 
> >I would dearly like to know the first 75 or so nonzero
> >digits of e to the -2500 power.
> 
> 1.83567266916215689307725305187314756746974669626209549936356569265433541 
> * 10^(-1086)
> 
> I got this using Mathematica 1.2 on a Macintosh II, using the command
> 
> In[1]:=
>   N[E^(-2500),75]
> 
> -- Mark Wilkins
>    wilkins at jarthur.claremont.edu

Using REDUCE on a PC AT, and inputting  precision 75; e^(-2500);
results in

1.835 67266 91621 56893 07725 30518 73147 56746 97466 96262 09549 936

35 65692 65433 54141 4 E - 1086

which is clearly 75 places.  (I wonder where Mathematica lost the last 3
places?)

Stan Kameny
  stan_kameny at rand.org
(*----------------------------------------------------------------------*)


From: wilkins at jarthur.Claremont.EDU (Mark Wilkins)
Subject: Re: A request
Date: 21 Jan 90 00:31:49 GMT
Newsgroups: sci.math.symbolic

In article <101.UUL1.2#239 at valley.UUCP> stan at valley.UUCP (Stanley L. Kameny) writes:
>
>which is clearly 75 places.  (I wonder where Mathematica lost the last 3
>places?)

User error in cut-and-paste on my Mac.  Oh, well.  Those three digits may
cause World War III or something but I hope not...

-- Mark Wilkins
   wilkins at jarthur.claremont.edu
(*----------------------------------------------------------------------*)


From: ilan at Gang-of-Four.Stanford.EDU (Ilan Vardi)
Subject: RunEncode competition
Date: 22 Jan 90 13:04:57 GMT
Newsgroups: sci.math.symbolic

I believe that I have discovered the simplest and most efficient
RunEncode program:

   Attributes[times] = {Flat}

   times[{a_, m_}, {a_, n_}] := times[{a, m + n}]

   RunEncodeIlan[x_] := List @@ times @@ ({#, 1}& /@ x)

The idea of the program is that, algebraically, RunEncode is a
model of a free semigroup (it seemes that that the best approach is
to convert the problem into an algebraic question). For example, 
if *** is a semigroup product then when you are not given any 
relations (i.e., it's a free semigroup)

a *** b *** b *** a *** a => a *** b^2 *** a^2.

So all you need to do is to program the associative law, but this is
done for you by setting Attributes => {Flat}. I believe that most of
the work done by the other programs is essentially spent reprogramming
the associative law. Note that the "times" on the right hand side of
the second line is need to get the right answer for input like {a, a},
i.e., of length > 1 but with only one element.

You can use similar ideas to write weird programs that almost work:

Unprotect[Times]; Attributes[Times] := {Flat, Listable}

RunEncodeStrange[x_] := {1, -1} List @@ # & /@ List @@ Times @@ (1/x)


Here is a comparison of running times on a Sun 3 of my program with
the winning program and an unsubtle "C type" program

RunEncodeWin[{rest___, w:(x_)..}] :=
   Append[RunEncodeWin[{rest}], {x, Length[{w}]}]

RunEncodeWin[{}] := {}

RunEncodeC[list_List] := 
          Block[{t = {}, i = j = 1, k = Length[list]},
                While[i <= k, 
                      While[j <= k && list[[i]] == list[[j]], j++];
                      AppendTo[t, {list[[i]], j - i}]; i += j - i];
                t]

timing[x_] := Block[{t},
                    t = {Timing[RunEncodeWin[x]],
                         Timing[RunEncodeIlan[x]],
                         Timing[RunEncodeC[x]]};
                   {First /@ t, SameQ @@ Last /@ t}]


Mathematica (sun3.68881) 1.2 (August 3, 1989) [With pre-loaded data]
by S. Wolfram, D. Grayson, R. Maeder, H. Cejtin,
   S. Omohundro, D. Ballman and J. Keiper
with I. Rivin and D. Withoff
Copyright 1988,1989 Wolfram Research Inc.
Temporary license: expiration date is 1 Jun 1990.
 -- Terminal graphics initialized -- 

In[1]:= <<RunEncode.m

In[2]:= x = {a,a,b,b,a,a,b,c,c,a,a}

Out[2]= {a, a, b, b, a, a, b, c, c, a, a}

In[3]:= RunEncodeWin[x]

Out[3]= {{a, 2}, {b, 2}, {a, 2}, {b, 1}, {c, 2}, {a, 2}}

In[4]:= RunEncodeIlan[x]

Out[4]= {{a, 2}, {b, 2}, {a, 2}, {b, 1}, {c, 2}, {a, 2}}

In[5]:= RunEncodeStrange[x]

Out[5]= {{a, 2}, {b, 2}, {a, 2}, {b, 1}, {c, 2}, {a, 2}}

In[6]:= x = Digits[3^20, 2]

Out[6]= {1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 
 
>    1, 1, 0, 0, 1, 0, 0, 0, 1}

In[7]:= timing[x]

Out[7]= {{0.283333 Second, 0.133333 Second, 0.25 Second}, True}

In[8]:= timing[Digits[3^100, 2]]

Out[8]= {{10.9 Second, 2.13333 Second, 2.4 Second}, True}

In[9]:= timing[Flatten[{#,#,#}& /@ Range[100]]]

Out[9]= {{37.0667 Second, 6.85 Second, 4.65 Second}, True}

In[10]:= timing[Range[100]]

Out[10]= {{6.5 Second, 0.116667 Second, 2.2 Second}, True}
(*----------------------------------------------------------------------*)




  • Prev by Date: Mathematica and External Numeric Packages.
  • Previous by thread: Mathematica and External Numeric Packages.