Rubi GeneralizedTrinomialParts → {a,b,c,n,q}: * u ≡ a·x^q + b·x^n + c·x^(2n−q)
(u: Expression, x: string)
| 1974 | const f = rec(u); |
| 1975 | if (f === null || vAcc === null) return null; |
| 1976 | return { f, v: vAcc, n: nAcc! }; |
| 1977 | } |
| 1978 | |
| 1979 | /** Rubi BinomialParts product combination: (a+b·x^m)·(c+d·x^n) */ |
| 1980 | function combineBinProduct(p: BinParts, q: BinParts): BinParts | null { |
| 1981 | const aZ = p.a.isSame(0) || zeroQ(p.a); |
| 1982 | const cZ = q.a.isSame(0) || zeroQ(q.a); |
| 1983 | const { b, n: m } = p; |
| 1984 | const { b: d, n } = q; |
| 1985 | if (aZ && cZ) |
| 1986 | return { |
| 1987 | a: p.a.engine.Zero, |
| 1988 | b: b.mul(d).evaluate(), |
| 1989 | n: m.add(n).evaluate(), |
| 1990 | }; |
| 1991 | if (aZ && zeroQ(m.add(n))) |
| 1992 | return { a: b.mul(d).evaluate(), b: b.mul(q.a).evaluate(), n: m }; |
| 1993 | if (cZ && zeroQ(m.add(n))) |
| 1994 | return { a: b.mul(d).evaluate(), b: p.a.mul(d).evaluate(), n }; |
| 1995 | if (zeroQ(m.sub(n)) && zeroQ(p.a.mul(d).add(b.mul(q.a)))) |
| 1996 | return { |
| 1997 | a: p.a.mul(q.a).evaluate(), |
| 1998 | b: b.mul(d).evaluate(), |
| 1999 | n: m.mul(2).evaluate(), |
| 2000 | }; |
| 2001 | return null; |
| 2002 | } |
| 2003 | |
| 2004 | /** Rubi TrinomialParts[u,x] → {a,b,c,n} with u ≡ a + b·x^n + c·x^(2n) */ |
| 2005 | function trinomialPartsX(u: Expression, x: string): TriParts | null { |
| 2006 | const ce = u.engine; |
| 2007 | if (!u.has(x)) return null; |
| 2008 | |
| 2009 | const coeffs0 = polyCoeffsX(u, x); |
| 2010 | if (coeffs0 !== null) { |
| 2011 | const coeffs = trimZeros(coeffs0); |
| 2012 | const L = coeffs.length; |
| 2013 | if (L < 3 || L % 2 === 0) return null; |
| 2014 | const mid = (L - 1) / 2; |
| 2015 | if (coeffs[mid].isSame(0) || zeroQ(coeffs[mid])) return null; |
| 2016 | for (let i = 1; i < L - 1; i++) |
| 2017 | if (i !== mid && !(coeffs[i].isSame(0) || zeroQ(coeffs[i]))) return null; |
| 2018 | return { |
| 2019 | a: coeffs[0], |
| 2020 | b: coeffs[mid], |
| 2021 | c: coeffs[L - 1], |
| 2022 | n: ce.number(mid), |
| 2023 | }; |
| 2024 | } |
| 2025 | |
| 2026 | const ops = u.ops; |
| 2027 | if (!ops) return null; |
| 2028 | const scaleTri = (s: Expression, t: TriParts): TriParts => ({ |
| 2029 | a: s.mul(t.a).evaluate(), |
| 2030 | b: s.mul(t.b).evaluate(), |
| 2031 | c: s.mul(t.c).evaluate(), |
no test coverage detected