Description
The function
f is applied to every pair
(p,q) where
p is a key of
x and
q is a key of
y. The number of times
f is evaluated is thus the product of the number of keys in
x and the number of keys in
y.
The function
h should be an associative function, for otherwise the result may depend on internal details about the implementation of hash tables that affect the order in which entries are encountered. If
f,
t (if present),
g, and
h are commutative functions as well, then the result
z is a commutative function of
x and
y.
The result is mutable if and only if
x or
y is.
This function can be used for multiplying polynomials, where it can be used in code something like this:
combine(x, y, monomialTimes, coeffTimes, coeffPlus)
We illustrate that with a simpleminded implementation of the free ring on the English alphabet, representing words as string and polynomials as hash tables that associate coefficients to words.
i1 : Poly = new Type of HashTable
o1 = Poly
o1 : Type

i2 : p = new Poly from { "" => 1, "x" => 2, "y" => 3, "cat" => 5 }
o2 = Poly{"" => 1 }
"cat" => 5
"x" => 2
"y" => 3
o2 : Poly

i3 : Poly * Poly := (p,q) > combine(p,q,concatenate,times,plus);

i4 : p*p
o4 = Poly{"" => 1 }
"cat" => 10
"catcat" => 25
"catx" => 10
"caty" => 15
"x" => 4
"xcat" => 10
"xx" => 4
"xy" => 6
"y" => 6
"ycat" => 15
"yx" => 6
"yy" => 9
o4 : Poly

One may also use this function for multiplying divided powers in a similar manner:
combine(x, y, monomialTimes, divPowCoeff, coeffTimes, coeffPlus)
For example:
i5 : DivPowPoly = new Type of HashTable
o5 = DivPowPoly
o5 : Type

i6 : divPowCoeff = (i,j) > binomial(i+j,i)
o6 = divPowCoeff
o6 : FunctionClosure

i7 : p = new DivPowPoly from { 0 => 1, 1 => 1 }
o7 = DivPowPoly{0 => 1}
1 => 1
o7 : DivPowPoly

i8 : DivPowPoly * DivPowPoly := (p,q) > combine(p,q,plus,divPowCoeff,times,plus);

i9 : p*p
o9 = DivPowPoly{0 => 1}
1 => 2
2 => 2
o9 : DivPowPoly
