设
B
=
{
0
,
1
}
B={0,1}
B={0,1},定义
B
B
B上的或、与、非运算如下
构成布尔代数
(
B
,
∨
,
∧
,
¬
)
(B,vee,wedge,neg)
(B,∨,∧,¬)。
Python中所有的关系运算结果均为布尔值:非True即False。常用关系运算符罗列如下:
| 运算符 | 含义 | |
|---|---|---|
| (1) | < | 严格小于 |
| (2) | <= | 小于或等于 |
| (3) | > | 严格大于 |
| (4) | >= | 大于或等于 |
| (5) | == | 等于 |
| (6) | != | 不等于 |
| (7) | in | 元素在集合内 |
分别用运算符“or”、“and”和“not”表示
∨
vee
∨、
∧
wedge
∧和
¬
neg
¬。关系运算和布尔代数是程序设计中循环和分支语句的灵魂,在下面的例子中可见一斑。
例1 设
P
P
P为一数域,
n
∈
nin
n∈ℕ,由符号
x
x
x,常数
a
0
,
a
1
,
⋯
,
a
n
−
1
∈
P
a_0,a_1,cdots,a_{n-1}in P
a0,a1,⋯,an−1∈P构成的表达式
a
0
+
a
1
x
+
⋯
+
a
n
−
1
x
n
−
1
a_0+a_1x+cdots+a_{n-1}x^{n-1}
a0+a1x+⋯+an−1xn−1
称为数域
P
P
P上
x
x
x的一元多项式,简称为多项式。其中,符号
x
x
x称为变元,
a
i
x
i
a_ix^i
aixi称为
i
i
i次项,
a
i
a_i
ai为
i
i
i次项的系数,
i
=
0
,
1
,
2
,
⋯
,
n
−
1
i=0,1,2,cdots,n-1
i=0,1,2,⋯,n−1。非零系数最大下标
k
(
<
n
)
k(
其中,a[i]表示多项式的第i次项系数
a
i
a_i
ai在数组a中的第i个元素值。约定:零多项式的系数序列为空“[ ]”。
解:解决本问题需考虑如下几个关键点:
- 零多项式需特殊处理;
- 常数项,也就是0次项不带变元x的幂;
- 1次项的变元x不带幂指数a[1]・x;
- 负系数自带与前项的连接符“
−
-
−”,非负项系数需在前加入连接符“
+
+
+”;
Python中的list类对象和numpy的array类对象均可作为存储序列的数组,为解决本问题的Python代码如下。
import numpy as np #导入numpy
from fractions import Fraction as F #导入Fraction
def exp(a): #多项式表达式
n=len(a) #系数序列长度
s='' #初始化空串
if n==0: #零多项式
s=s+'0'
else: #非零多项式
for i in range(n): #对每一项
if i==0: #常数项
s=s+'%s'%a[i]
if i==1 and a[i]>=0: #非负1次项
s=s+'+%s・x'%a[i]
if i==1 and a[i]<0: #负1次项
s=s+'%s・x'%a[i]
if i>1 and a[i]>=0: #非负项
s=s+'+%s・x**%d'%(a[i],i)
if i>1 and a[i]<0: #负项
s=s+'%s・x**%d'%(a[i],i)
return s #返回表达式串
a=[1,-2,1]
b=[F(0),F(-1,2),F(0),F(1,3)]
c=np.array([0.0,-0.5,0.0,1/3])
d=[]
print(exp(a))
print(exp(b))
print(exp(c))
print(exp(d))
本程序中第3~24行定义的函数名为exp,参数表中仅含一个表示存储多项式系数序列的数组a。函数定义体内罗列出函数处理数据的操作步骤。exp函数中,第4行调用Python的len函数计算数组a的长度,即所含元素个数,赋予变量n。Python中的字符串类型实现了代数系统
(
Σ
∗
,
+
)
(Sigma^*,+)
(Σ∗,+),其中
Σ
Sigma
Σ为ASCII码符号集,+运算连接两个字符串。Python的串常量是用单引号括起来的一个字符序列,第5行将表达式串初始化为空串’ ‘。第619行的**if-else**分支语句根据a的长度是否为0分别处理零多项式和非零多项式。对于零多项式,第7行直接将单字符串’0’添加到空串s之后。处理非零多项式的第919行的for循环语句,扫描数组a,处理多项式的每一项。第10~11行的if语句处理常数项,注意第11行中连接到s尾部的’%s’%a[i]称为格式串。串中’%s’称为格式符,意为以串的格式加载单引号后面的数据项a[i]。格式串的一般形式为
’含格式符的串’%(数据项表)
text{'含格式符的串'%(数据项表)}
’含格式符的串’%(数据项表)
含格式符串中格式符的个数与数据项表中数据项个数必须相同,若数据项表中仅有一个数据项,括号可省略如第11行中的格式串。常用格式符包含表示字串格式%s,十进制整数格式%d,十进制浮点型格式%f,……等等。类似地,第12~13行处理非负的1次项;第14~15行处理负的1次项;第16~17行处理以后的非负项;第18~19行处理负系数项。循环结束,第20行返回串s。
程序的第21行用list类对象a表示多项式
1
−
2
x
+
x
2
1-2x+x^2
1−2x+x2的系数序列[1, -2, 1],其中的元素为整数型数据;第22行也是用list对象b表示多项式
1
2
x
+
1
3
x
3
frac{1}{2}x+frac{1}{3}x^3
21x+31x3的系数序列,元素类型为Fraction;第23行用numpy的array对象c的数组array([0.0,-0.5,0.0,1/3])表示多项式
1
2
x
+
1
3
x
3
frac{1}{2}x+frac{1}{3}x^3
21x+31x3的系数序列,注意numpy的array类对象可以用list对象[0.0,-0.5,0.0,1/3]做初始化;第24行用空的list对象d表示零多项式系数序列。第25~{}28行分别调用exp函数输出a、b、c、d的表达式串。运行程序,输出
1-2・x+1・x**2 0-1/2・x+0・x**2+1/3・x**3 0.0-0.5・x+0.0・x**2+0.3333333333333333・x**3 0
本程序定义的创建多项式表达式串的函数exp将系数为
0
0
0的项也表示在表达式中,显得有点笨拙。建议看官修改exp,在所创建的表达式串中忽略系数为
0
0
0的项。
写博不易,敬请支持:
如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!



