--* From C1LEHOB%WATSON.vnet.ibm.com@yktvmh.watson.ibm.com  Wed May 25 11:22:02 1994
--* Received: from yktvmh.watson.ibm.com by asharp.watson.ibm.com (AIX 3.2/UCB 5.64/930311)
--*           id AA16650; Wed, 25 May 1994 11:22:02 -0400
--* Received: from watson.vnet.ibm.com by yktvmh.watson.ibm.com (IBM VM SMTP V2R3)
--*    with BSMTP id 2181; Wed, 25 May 94 11:22:08 EDT
--* Received: from YKTVMH by watson.vnet.ibm.com with "VAGENT.V1.0"
--*           id <A.C1LEHOB.NOTE.VAGENT2.7249.May.25.11:22:06.-0400>
--*           for asbugs@watson; Wed, 25 May 94 11:22:07 -0400
--* Received: from YKTVMH by watson.vnet.ibm.com with "VAGENT.V1.0"
--*           id 7247; Wed, 25 May 1994 11:22:06 EDT
--* Received: from cyst.watson.ibm.com by yktvmh.watson.ibm.com (IBM VM SMTP V2R3)
--*    with TCP; Wed, 25 May 94 11:22:05 EDT
--* Received: from radical.watson.ibm.com by cyst.watson.ibm.com (AIX 3.2/UCB 5.64/900528)
--*   id AA313918; Wed, 25 May 1994 11:18:11 -0400
--* Received: by radical.watson.ibm.com (AIX 3.2/UCB 5.64/900524)
--*           id AA13028; Wed, 25 May 1994 11:16:57 -0400
--* Date: Wed, 25 May 1994 11:16:57 -0400
--* From: lehobey@radical.watson.ibm.com
--* X-External-Networks: yes
--* Message-Id: <9405251516.AA13028@radical.watson.ibm.com>
--* To: asbugs@watson.ibm.com
--* Subject: [1] Error in type substitution (see bug649) [barry.as][0.35.3]

--@ Fixed  by:  SSD   Tue Apr 18 09:58:22 EDT 1995 
--@ Tested by:  none 
--@ Summary:    Type substitution bugs fixed. extra decls/imports needed to compile the file. 


--
-- find an intermediate extension if there is between Q(a) and Q , return
--  a primitive element ; if there is not return 0
--
-- A# Version
--
#include "axiom.as"

Barry(UP) : Front == Backyard where
  AN ==> AlgebraicNumber
  default UP : UnivariatePolynomialCategory AN
  SUP ==> SparseUnivariatePolynomial
  FRAC ==> Fraction
  INT ==> Integer
  POLY ==> Polynomial
  EXPR ==> Expression

  Front ==> with
    intermediateExtension : UP -> AN

  Backyard ==> add

    import from AlgFactor(UP)
    import from Factored(UP)
    import from List AN
    import from Record(factor:UP, exponent:INT)

    intermediateExtension(f:UP):AN ==
      a:=rootOf(makeSUP(f))
      lf:List Record(factor:UP,exponent:INT):=factors(factor(f,[a]))
      lf1:=lf.1 -- because of an error in if
      lf1f:=lf1.factor
      if (not zero?(lf1f(a))) then
      -- if (not zero?((lf.1.factor)(a))) then
        swap!(lf,1, position( (v:Record(factor:UP, exponent:INT)):Boolean +->
          zero?((v.factor)(a)) ,lf ))
      k:=#lf
      for i:INT in 3..2**k-1 by 2 repeat
        -- compute g
        g:=1$UP
        for j:INT in 1..k repeat
          -- indices...
          if bit?(i,j-1) then g:=g*lf.j.factor
        -- coefficents
        for c in coefficients(g)
          | retractIfCan(c)@Union(value1:FRAC INT,failed:'failed') case failed repeat
            -- compute the norm
            cc:=c::EXPR INT
            kc:=first kernels(cc)
            aa:=definingPolynomial(a::EXPR INT)
            ka:=first kernels(aa)
            x:Symbol := new()
            xk:Kernel EXPR INT := kernel x
            cc:= xk::EXPR(INT)-cc
            h:EXPR INT:=resultant(numer univariate(cc,kc), numer univariate(aa,ka))
            uh:=numer univariate(h,xk)
            if not unit? gcd(uh,D(uh)) then return c
      0





















 
