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