是否有一个简单的命令可以找到任何一组术语的最大公约数 (GCD)?
我正在尝试使用随机数来生成以下形式的复三项式ax^2+bx+c使得一、二、三都是整数,并且A不是一个。
但有时我会得到如下输出:
5x^2+15x+10在这种情况下,学生会分解出 5 并做
5(x^2+3x+2)
5(x+2)(x+1)
我希望我的初始复三项式缺少非一个 GCD。更好的是,如果难度不大的话,我希望可以选择是否允许非一个 GCD,并显示该三项式的完全分解形式。
下面的代码不起作用。
我还需要做什么?
ps 讽刺的是,我不知道如何在这些论坛中显示 LaTeX 输出。这可能吗?
\documentclass{article}
\usepackage{ifthen}
\usepackage{pgf}
\pgfmathsetseed{\number\pdfrandomseed}
\usepackage{pgffor}
\newcommand{\InitVariables}
{%
\pgfmathsetmacro{\a}{int(random(2,5))}
\pgfmathsetmacro{\b}{int(random(1,5))}
\pgfmathsetmacro{\c}{int(random(1,5))}
\pgfmathsetmacro{\d}{int(random(1,5))}
\pgfmathsetmacro{\A}{int(\a*\c)}
\pgfmathsetmacro{\B}{int(\a*\d+\b*\c)}
\pgfmathsetmacro{\C}{int(\b*\d)}
}
\newcommand{\ComplexTrinomial}
{%
\InitVariables
\large
\(\A{x}^2+\B{x}+\C=\)\hspace{4cm}\((\a{x}+\b)(\c{x}+\d)\)
\vspace{1cm}
}
\newcommand{\MyTrinomials}[1]
{\foreach \x in {1,2,...,#1} {\ComplexTrinomial\\}}
\begin{document}
\MyTrinomials{20}
\end{document}
答案1
随机生成的多项式?多项式系数的 GCD?您使用了足够的数学知识来考虑使用sagemath
位于这里在 CTAN 上,它允许您利用免费计算机代数系统的强大功能。在设置具有整数系数的多项式环后,poly1 = R.random_element(2) 会创建一个次数最多为 2 的随机多项式。下一行检查多项式的次数是否等于 2,系数的 GCD(称为内容)是否等于 1(因此没有共同因子),并确保多项式不是不可约的(可以分解因式)。请注意,Sage 会为您分解因式,因此不应该有任何错误。有关多项式命令的信息可以找到这里。
\documentclass{article}
\usepackage{sagetex}
\usepackage{amsmath}
\begin{document}
\begin{sagesilent}
R.<x>=ZZ[] #ring of polynomials with integral coefficients
poly1 = R.random_element(2) #choose polynomial from the ring with degree at most 2
while poly1.degree() != 2 or poly1.content() != 1 or poly1.is_irreducible() == True:
poly1 = R.random_element(2)
answer1 = factor(poly1)
# while degree is not equal to 2 or the GCD of the coefficients is not 1, or
# the polynomial is irreducible, keep picking a polynomial
\end{sagesilent}
\begin{enumerate}
\item Factor the polynomial $\sage{poly1}$.\\\\\\
\noindent The answer is $\sage{answer1}$\\\\
\begin{sagesilent}
R.<x>=ZZ[]
poly2 = R.random_element(2)
while poly2.degree() != 2 or poly2.content() != 1 or poly2.is_irreducible() == True:
poly2 = R.random_element(2)
answer2 = factor(poly2)
\end{sagesilent}
\item Factor the polynomial $\sage{poly2}$.\\\\\\
\noindent The answer is $\sage{answer2}$\\\\
\end{enumerate}
\end{document}
在 Sagemath Cloud 中运行给出输出:
使用sagemath
软件包需要您的计算机上有 Sage(麻烦)或免费的萨基马云帐户。
答案2
比其他任何东西都更能证明概念。它可以用纯 TeX 编写,但我很懒。需要 LuaLaTeX。
\RequirePackage{luatex85}
\documentclass[varwidth,border=5]{standalone}
\usepackage{amsmath,luacode}
\textwidth=8cm
\begin{luacode*}
function gcd(u, v)
u = math.abs(u)
v = math.abs(v)
if u == v then
return u
end
if u == 0 then
return v
end
if v == 0 then
return u
end
if u % 2 == 0 then
if v % 2 == 1 then
return gcd(math.floor(u / 2), v)
else
return gcd(math.floor(u / 2), math.floor(v / 2)) * 2
end
else
if v % 2 == 0 then
return gcd(u, math.floor(v / 2))
end
if u > v then
return gcd(math.floor((u - v) / 2), v)
else
return gcd(math.floor((v - u) / 2), u)
end
end
end
function solveQuadratic(a, b, c)
local d, x1, x2;
d = b * b - 4 * a * c
if d >= 0 then
x1 = (-b - math.sqrt(d)) / (2 * a)
x2 = (-b + math.sqrt(d)) / (2 * a)
if x1 ~= math.floor(x1) or x2~= math.floor(x2) then
x1 = nil
x2 = nil
end
else
x1 = nil
x2 = nil
end
return {x1 = x1, x2 = x2}
end
function coef(a)
if a == 1 then
return ''
else
return a
end
end
function formatCoef(a, c)
local str = ''
if a ~= 0 then
if math.abs(a) > 1 or c == '' then
str = str .. math.abs(a)
end
if a < 0 then
str = '-' .. str
end
str = str .. c
end
return str
end
function formatQuadratic(a, b, c)
local str = ''
str = formatCoef(a, 'x^2')
if str ~= '' and b > 0 then
str = str .. '+'
end
str = str .. formatCoef(b, 'x')
if str ~= '' and c > 0 then
str = str .. '+'
end
str = str .. formatCoef(c, '')
return str
end
function formatFactoredQuadratic(x1, x2, g)
local str = ''
if x1 == 0 then
str = 'x'
else
if x1 > 0 then
str = str .. '(x + ' .. x1 .. ')'
else
str = str .. '(x ' .. x1 .. ')'
end
end
if x2 == 0 then
str = str .. 'x'
else
if x2 > 0 then
str = str .. '(x + ' .. x2 .. ')'
else
str = str .. '(x ' .. x2 .. ')'
end
end
if g ~= nil then
if math.abs(g) > 1 then
str = g .. str
elseif g == -1 then
str = '-' .. str
end
end
return str
end
function genEq(n, gc)
local a, b, c, g, h1, h2, eqs
if gc == nil then
h1 = 1
h2 = 1000 -- some large number
else
h1 = 0
h2 = 1
end
eqs = {n=0}
for a = -n,n do
for b = -n,n do
for c = -n,n do
if a ~= 0 and b ~=0 and c ~= 0 then
g = gcd(gcd(a, b), c)
if g > h1 and g <= h2 then
if a < 0 then
s = solveQuadratic(-a, -b, -c)
g = -g
else
s = solveQuadratic(a, b, c)
end
if s.x1 ~= nil and s.x2 ~= nil then
table.insert(eqs, {eq = formatQuadratic(a, b, c),
fct = formatFactoredQuadratic(-s.x1, -s.x2, g)})
eqs.n = eqs.n + 1
end
end
end
end
end
end
return eqs
end
\end{luacode*}
\begin{document}
\begin{align*}
\intertext{Lacking a non-1 GCD}
\directlua{%
eqs = genEq(10,1)
for i = 1,5 do
x = math.random(1, eqs.n)
tex.print(eqs[x].eq .. ' &= ' .. eqs[x].fct ..'\noexpand\\\noexpand\\')
end
}
\\\intertext{Not lacking a non-1 GCD}
\directlua{%
eqs = genEq(10)
for i = 1,5 do
x = math.random(1, eqs.n)
tex.print(eqs[x].eq .. ' &= ' .. eqs[x].fct ..'\noexpand\\\noexpand\\')
end
}
\\
\end{align*}
\end{document}