MathGroup Archive 2008

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

Search the Archive

Re: Set::setraw error

  • To: mathgroup at smc.vnet.net
  • Subject: [mg90352] Re: [mg90326] Set::setraw error
  • From: DrMajorBob <drmajorbob at att.net>
  • Date: Mon, 7 Jul 2008 05:05:31 -0400 (EDT)
  • References: <32330841.1215353835393.JavaMail.root@m08>
  • Reply-to: drmajorbob at longhorns.com

The error message tells you that you can't Set variables used as  
arguments, in this case a=-a, for instance.

There are other problems, including the fact that x, y, and r are  
undefined the first time you use them in

{a, b, r, s, x, y} = {b, c, x - q*r, y - q*s, r, s}

which means (if you get rid of the "setraw" error), that statement will be  
an infinite loop all by itself.

If we knew what you were trying to accomplish, we might go farther, but  
for now I'll show you a partial solution WITH the infinite loop still  
present:

Clear[a,b,xgcd]
xgcd[0,0]={0,0,1};
xgcd[0,b_]={Abs@b,0,Sign@b};
xgcd[a_,0]={Abs@a,Sign@a,0};
xgcd[aa_,bb_]:=Module[{a=Abs@aa,b=Abs@bb},
xgcd[aa_, bb_] := Module[{a = Abs@aa, b = Abs@bb},
   While[b != 0,
    {c, q} = {Mod[a, b], Quotient[a, b]};
    Print@{c, q};
    {a, b, r, s, x, y} = {b, c, x - q*r, y - q*s, r, s}];
   {a, x*Sign@aa, y*Sign@bb}
   ]
xgcd[2,3]

{2,0}
$IterationLimit::itlim: Iteration limit of 4096 exceeded. >>
$IterationLimit::itlim: Iteration limit of 4096 exceeded. >>
$IterationLimit::itlim: Iteration limit of 4096 exceeded. >>
General::stop: Further output of $IterationLimit::itlim will be suppressed  
during this calculation. >>
{1,1}
{0,2}
{1,-Hold[r]+Hold[x],-Hold[s]+Hold[y]}

Notice I've changed the structure of the function to one that's much  
clearer (IMHO).

To become proficient in Mathematica you need to, among other things, erase  
Return from your memory.

Never use it again. EVER.

Bobby

On Sun, 06 Jul 2008 06:17:46 -0500, Steven Siew <stevensiew2 at gmail.com>  
wrote:

> I have encountered this Set:setraw error for the code below.
>
> I'm stumped. Does anyone have any idea what went wrong?
>
> xgcd[a_,b_]:=Module[{xsign=1,ysign=1,x=1,y=0,r=0,s=1,c,q},
>     If[a == 0 && b == 0,Return[{0,0,1}]];
>     If[a == 0,Return[{Abs[b],0,b/Abs[b]}] ];
>     If[b == 0,Return[{Abs[a],a/Abs[a],0}]];
>     If[a<0,a=-a; xsign=-1];
>     If[b<0,b=-b; ysign=-1];
>     While[b\[NotEqual]0,
>       {c,q}={Mod[a,b],Quotient[a,b]};
>       {a,b,r,s,x,y}={b,c,x-q*r,y-q*s,r,s}
>       ];
>     Return[{a,x*xsign,y*ysign}]
>     ]
>
> xgcd[2, 3]
>
> \!\(\*
>   RowBox[{\(Set::"setraw"\), \(\(:\)\(\ \)\), "\<\"Cannot assign to
> raw \
> object \\!\\(2\\). \\!\\(\\*ButtonBox[\\\"More\[Ellipsis]\\\", \
> ButtonStyle->\\\"RefGuideLinkText\\\", ButtonFrame->None, \
> ButtonData:>\\\"Set::setraw\\\"]\\)\"\>"}]\)
>
>



-- 
DrMajorBob at longhorns.com


  • Prev by Date: Re: exporting from mathematica to a poster
  • Next by Date: Re: Printing, WYSIWYG, and Window Magnification?
  • Previous by thread: Re: Set::setraw error
  • Next by thread: Re: Set::setraw error