Never heard about anything like this. (Doesn’t mean much, I am not a professional mathematician.)
Just thinking out loud...
Trivial examples are: “g is identity”, “g is constant”, “f is constant”.
A non-trivial example would be “f = x^3”, “g = absolute value”.
Something in between: A is a binary representation of an integer, f is an operation where a lower bit of an input never has an impact on a higher bit of the output (for example: a square root, rounded down), g is setting the last K bits to some constant value.
Functions f and g cannot both be bijections, otherwise g◦f◦id◦f = g◦f◦g◦f would imply id=g .
If you have functions f1 and g1 : A → A with this property, and also f2 and g2 : B → B with this property, the functions f([a, b]) = [f1(a), f2(b)] and g([a, b]) = [g1(a), g2(b)] : A×B → A×B will also have this property.
But the commutativity is not necessary, in the case where f = “square root, rounded down” and g = “x rounded down to a multiple of K”. In such case, it is true that gg = g, but not always gf = fg, and yet always gfg = gf.
From that example, I would be tempted to generalize that gg = g and fg = f. But that would not be true for x^3 and absolute value.
So maybe gg = g and gfg = gf? Is it sufficient? gfgf = gff. gfgfgf = gfgff = gfff. Yes, it is. Is it necessary? No, for example if f is a constant then gg does not have to be equal to g and it will work anyway. There are also counter-examples if f is not a constant, for example if we have a bijection between N and NN, then let f([a, b]) = [a^3, K] and g([a, b]) = [|a|, whatever(b)]; then gfgf([a, b]) = gff([a, b]) = [|a^9|, whatever(K)].
This is the moment where I give up. It was tempting to translate g(f^n) = (gf)^n into a set of equations that does not include n, but apparently I can’t do it.
Is that equation supposed to hold for one specific value of n, or for each n?
For e.g. n = 2, am I parsing it correctly as “g(f(f(x))) = g(f(g(f(x))))”?
You’re parsing it correctly, and it’s supposed to hold for all n.
Never heard about anything like this. (Doesn’t mean much, I am not a professional mathematician.)
Just thinking out loud...
Trivial examples are: “g is identity”, “g is constant”, “f is constant”.
A non-trivial example would be “f = x^3”, “g = absolute value”.
Something in between: A is a binary representation of an integer, f is an operation where a lower bit of an input never has an impact on a higher bit of the output (for example: a square root, rounded down), g is setting the last K bits to some constant value.
Functions f and g cannot both be bijections, otherwise g◦f◦id◦f = g◦f◦g◦f would imply id=g .
If you have functions f1 and g1 : A → A with this property, and also f2 and g2 : B → B with this property, the functions f([a, b]) = [f1(a), f2(b)] and g([a, b]) = [g1(a), g2(b)] : A×B → A×B will also have this property.
...that’s all that comes to my mind.
This is an inspirational example. If g is idempotent (g^2 = g) and commutes with f (gf = fg), they will satisfy the property.
Wow, that is a nice generalization.
But the commutativity is not necessary, in the case where f = “square root, rounded down” and g = “x rounded down to a multiple of K”. In such case, it is true that gg = g, but not always gf = fg, and yet always gfg = gf.
From that example, I would be tempted to generalize that gg = g and fg = f. But that would not be true for x^3 and absolute value.
So maybe gg = g and gfg = gf? Is it sufficient? gfgf = gff. gfgfgf = gfgff = gfff. Yes, it is. Is it necessary? No, for example if f is a constant then gg does not have to be equal to g and it will work anyway. There are also counter-examples if f is not a constant, for example if we have a bijection between N and NN, then let f([a, b]) = [a^3, K] and g([a, b]) = [|a|, whatever(b)]; then gfgf([a, b]) = gff([a, b]) = [|a^9|, whatever(K)].
This is the moment where I give up. It was tempting to translate g(f^n) = (gf)^n into a set of equations that does not include n, but apparently I can’t do it.