/usr/share/yacas/univar.rep/sparse.ys is in yacas 1.3.6-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129  | // SparceUniVariate(variable,termlist) implements an internal representation
// for univariate polynomials
// termlist is the list of terms in the form {exponent,coeficient}
RuleBase("SparseUniVar",{var,termlist});
300 # SparseUniVar(_var,_terms1) * SparseUniVar(_var,_terms2) <-- 
SparseUniVar(var, MultiplyTerms(terms1,terms2));
300 # SparseUniVar(_var,_terms1) + SparseUniVar(_var,_terms2) <-- 
SparseUniVar(var, AddTerms(terms1,terms2));
300 # SparseUniVar(_var,_terms1) - SparseUniVar(_var,_terms2) <-- 
SparseUniVar(var, SubstractTerms(terms1,terms2));
// Add a term into a termlist: this function assumes that 
//  1) the list of terms is sorted in decreasing order of exponents
//  2) there are not two terms with the same exponent.
//  3) There is no term with cero coefficient 
// This assumptions are preserved.
// The parameter begining tell us where to begin the search
// (it is used for increasing the efficency of the algorithms!)
// The function returns the position at which the new term is added plus 1. 
// (to be used as begining for sucesive AddTerm calls
Function("AddTerm",{termlist,term,begining})
[
 Local(l,i);
 l := Length(termlist);
 If(term[2]!=0,
 [
  i:=begining;
// Fix-me: search by using binary search ?
  If (l>=1, While ((i<=l) And (term[1]<termlist[i][1])) i++);
  If  (i>l, [DestructiveAppend(termlist,term);i++;], 
          If (term[1]=termlist[i][1],
             [ Local(nc);
               nc:=termlist[i][2]+term[2];
                 If(nc!=0,DestructiveReplace(termlist,i,{term[1],nc}),
                          [DestructiveDelete(termlist,i);i--;]);
             ],  DestructiveInsert(termlist,i,term))
     );
 ]
  );
 i+1;
];
Function("AddTerms",{terms1,terms2})
[
  Local(result,begining,t);
  begining :=1;
  ForEach (t,terms2)
     begining :=AddTerm(terms1,t,begining);
  terms1;
];
Function("SubstractTerms",{terms1,terms2})
[
  Local(result,t);
  begining :=1 ;
  ForEach (t,terms2)
     begining := AddTerm(terms1,{t[1],-t[2]},1);
  terms1;
];
// Multiply a list of terms by a Single tem
Function("MultiplySingleTerm",{termlist,term}) 
[
 Local(result,t);
 result:={};
 If(term[2]!=0, 
       ForEach (t,termlist)
         DestructiveAppend(result,{t[1]+term[1],t[2]*term[2]}) );
 result;
];
Function("MultiplyTerms",{terms1,terms2}) 
[
 Local(result,t1,t2,begining);
 result:={};
 ForEach (t1,terms1)
 [
   begining :=1;
   ForEach (t2,terms2)
     begining := AddTerm(result,{t1[1]+t2[1],t1[2]*t2[2]},1);
 ];
 result;
];
Function("ExpandSparseUniVar",{s})
[
 Local(result,t,var,termlist);
 result :=0;
 var := s[1];
 termlist := s[2];
 ForEach (t,termlist)
 [
   Local(term);
   term := NormalForm(t[2]*var^t[1]);
   result := result + term;
 ];
 result;
];
// Implements the division of polynomials!
Function("DivTermList",{a,b})
[
 Local(q,nq,t,c,begining);
 q := {};
 // a[1][1] is the degree of a, b[1][1] is the degree of b
 While ((a!={}) And a[1][1]>=b[1][1])
  [
     begining := 1;
     If(InVerboseMode(),Echo("degree=",a[1][1]));
     nq := {a[1][1]-b[1][1],a[1][2]/b[1][2]}; // a new term of the quotient
     DestructiveAppend(q,nq);
     // We compute a:= a - nq* b
     ForEach (t,b)
       begining := AddTerm(a,{t[1]+nq[1],-t[2]*nq[2]},begining);
   ];  
   // a is the rest at the end
 q;
];
 |