描述
学生在数学类中常规执行的任务之一是求解多项式方程。给定多项式,例如X2-4X + 1,找到它的根(2±√3)。
如果学生的任务是找到给定多项式的根,那么教师的任务是找到具有给定根的多项式。 Galsone女士是一个热心的数学老师,无聊找到解决方案的二次方程,就像a +b√c一样简单。她想要制作更高程度的方程,它的解更复杂一些。像数学类中的常见问题一样,她希望将所有系数保持为整数,并保持多项式的程度尽可能小(只要它具有指定的根)。请帮助她写一个程序,执行老师的任务。
你得到一个数字t的形式:
t =m√a+n√b
其中a和b是不同的素数,m和n是大于1的整数。
在这个问题中,要求你找到整数的t的最小多项式,即满足以下条件的多项式F(X)= adXd + ad-1Xd-1 + ... + a1X + a0。
系数a0,...,ad是整数,并且ad> 0。
F(t)= 0。
满足上述两个条件的多项式中的次数d是最小的。
F(X)是原始的。也就是说,系数a0,...,ad没有大于1的公约数。
例如,整数上的最小多项式为F(X)= X4 - 10X2 + 1。验证F(t)= 0如下(α=√3,β=√2) 。
F(t)=(α+β)4 -10(α+β)2 + 1
=(α4+4α3β+6α2β2+4αβ3+β4)-10(α2+2αβ+β2)+ 1
= 9 +12αβ+ 36 +8αβ+ 1-10(3 +2αβ+ 2)+ 1
=(9 + 36 + 4-50 + 1)+(12 + 8-20)αβ
= 0
验证F(t)的程度实际上最小是更困难的。幸运的是,在这个问题给出的条件下,即a和b是不同的素数,m和n大于1,最小多项式的次数总是mn。此外,它总是monic。也就是说,其最高阶项(ad)的系数为1。
输入
输入由多个数据集组成,每个数据集的格式如下。
a m b n
该线表示m√a+n√b。 最后一个数据集后面是由四个零组成的单行。 单行中的数字由单个空格分隔。
每个数据集满足以下条件。
1.m√a+n√b≤4。
2.mn≤20。
答案a0,...,ad的系数在(-231 + 1)和(231-1)之间,包括这两个系数。
输出
对于每个数据集,以以下格式输出其最小多项式在整数F(X)= adXd + ad-1Xd-1 + ... + a1X + a0上的系数。
ad ad-1 ... a1 a0
非负整数必须打印无符号(+或 - )。 单行中的数字必须由单个空格分隔,并且输出中不会显示其他字符或额外空格