       Re: Problem overriding simple built-in functions

• To: mathgroup at smc.vnet.net
• Subject: [mg28831] Re: Problem overriding simple built-in functions
• From: "Allan Hayes" <hay at haystack.demon.co.uk>
• Date: Tue, 15 May 2001 00:59:02 -0400 (EDT)
• References: <9dld4j\$o9b@smc.vnet.net>
• Sender: owner-wri-mathgroup at wolfram.com

```One way out of this difficulty is to define

MyGCD[x___]:= GCD@@Flatten[{x}]

This gives

MyGCD[{3,6}]

3

Another possibility is suggested at the end of the following discussion.

Here is what seems to be happening with the examples that you give.

In Mathematica 4.1 we have

atts=Attributes[GCD]

{Flat,Listable,Orderless,Protected}

[though in Help Browser, Listable is not mentioned]

After

Unprotect[GCD];
GCD[x_List]:=GCD@@x

I get, as you report,

GCD[{3,6}]

{3,6}

The explanation is that the attribute  Listable is used before any rules for
GCD are looked for.
So the main steps in the evaluation are

GCD[{3,6}]
{GCD,GCD}   because of the attribute  Listable
{3,6}

That new assignment was never used.

With regard to

Apply[GCD,{3,6}]

3

The mains steps are

Apply[GCD,{3,6}]
GCD[3,6]
3

HOWEVER: it is not sufficient to clear the attribute, Listable:

ClearAttributes[GCD, Listable];

We still get

GCD[{3,6}]

GCD[{3,6}]

This is due to the attribute  Flat:

Starting with GCD[{3,6}] a peculiarity of the attribute Flat is that
x_ in GCD[x_List]:=GCD@@x is matched to a held GCD[{3,6}] in the
expression
GCD[GCD[{3,6}]] which evaluates to GCD[{3,6}] without further evaluation

Clear the old definition:

GCD[x_List]:=.

GCD[{x___}] := GCD[x]

Now  we get

GCD[{3,6}]

3

--
Allan
---------------------
Allan Hayes
Mathematica Training and Consulting
Leicester UK
www.haystack.demon.co.uk
hay at haystack.demon.co.uk
Voice: +44 (0)116 271 4198
Fax: +44 (0)870 164 0565

"Jean-Christophe Deschamps" <jchd at worldnet.fr> wrote in message
news:9dld4j\$o9b at smc.vnet.net...
> Hi,
>
> I'm told the following occurs under Mathematica v4.0:
>
> In:= GCD[{3, 6}]
> Out= {3, 6}
> In:= GCD[x_List] := Apply[GCD, x]
> In:= GCD[{3, 6}]
> Out= GCD[{3, 6}]
> In:= Apply[GCD, {3, 6}]
> Out= 3
>
> Why is it so? It looks like the override is ignored, but why?
>
> The same exerpt seems to work fine under version 2.x.
>

```

• Prev by Date: Re: Problem overriding simple built-in functions
• Next by Date: Re: Problem overriding simple built-in functions
• Previous by thread: Re: Problem overriding simple built-in functions
• Next by thread: Re: Problem overriding simple built-in functions