
NONZEROANDFREEOF(XARGUMENTX, BARGUMENTE)
:= IS(EARGUMENTE # 0 AND FREEOF(XARGUMENTX, EARGUMENTE))$
MATCHDECLARE(AARGUMENTA, NONZEROANDFREEOF(XARGUMENTX), BARGUMENTB,
FREEOF(XARGUMENTX))$
DEFMATCH(LINEAR, AARGUMENTA*XARGUMENTX+BARGUMENTB, XARGUMENTX)$
ANTID(FN, VAR, UNK) := BLOCK(
  [LCLVARIABLELCL, DVARIABLED, AARGUMENTA, BARGUMENTB, TVARIABLET,
  UVARIABLEU, KILLER],
   DVARIABLED : DERIVDEGREE(FN, UNK, VAR),
   IF DVARIABLED = 0 THEN (
    TVARIABLET : INTEGRATE(FN, VAR),
      IF 
      NOT FREEOF(NOUNIFY(INTEGRATE), TVARIABLET) 
      THEN RETURN([0, FN]) ELSE 
      RETURN([TVARIABLET, 0])  ),
   UVARIABLEU : DIFF(UNK, VAR, DVARIABLED),
   KILLER(EARGUMENTE) := IF 
    HIPOW(EARGUMENTE, UVARIABLEU) <= 1 
   THEN EARGUMENTE ELSE 0,
   IF 
    LINEAR(FN, UVARIABLEU) = FALSE 
   THEN (
    TVARIABLET : EXPAND(FN),
      IF 
      PART(TVARIABLET, 0) # "+" 
      THEN 
      RETURN([0, TVARIABLET]),
      AARGUMENTA : MAP(KILLER, TVARIABLET),
      RETURN(ANTID(AARGUMENTA, VAR, UNK)+[0, RATSIMP(FN-AARGUMENTA)])
       ),
   TVARIABLET : SUBST(DIFF(UNK, VAR, DVARIABLED-1), LCLVARIABLELCL,
   INTEGRATE(SUBST(LCLVARIABLELCL, DIFF(UNK, VAR, DVARIABLED-1),
   EXPAND(AARGUMENTA)), LCLVARIABLELCL)),
   IF 
    NOT FREEOF(NOUNIFY(INTEGRATE), TVARIABLET) 
   THEN 
    RETURN([0, AARGUMENTA*UVARIABLEU]+ANTID(BARGUMENTB, VAR, UNK)),
   RETURN([TVARIABLET, 0]+ANTID(RATSIMP(FN-DIFF(TVARIABLET, VAR)),
   VAR, UNK))  )$
ANTIDIFF(FN, VAR, UNK) := BLOCK(
  [TVARIABLET],
   TVARIABLET : ANTID(FN, VAR, UNK),
   RETURN(PART(TVARIABLET, 1)+'INTEGRATE(PART(TVARIABLET, 2), VAR))  )$
