线性代数Python计算:Python的布尔代数

在这里插入图片描述
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 ∈ n\in nℕ,由符号 x x x,常数 a 0 , a 1 , ⋯   , a n − 1 ∈ P a_0,a_1,\cdots,a_{n-1}\in P a0,a1,,an1P构成的表达式
a 0 + a 1 x + ⋯ + a n − 1 x n − 1 a_0+a_1x+\cdots+a_{n-1}x^{n-1} a0+a1x++an1xn1
称为数域 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,,n1。非零系数最大下标 k ( < n ) k(<n) k(<n),称为多项式的次数 k = 0 k=0 k=0时, 0 0 0次多项式即为一常数 a 0 ≠ 0 a_0\not=0 a0=0。定义常数 0 0 0为特殊的零多项式,零多项式是唯一没有次数的多项式。为统一计,规定零多项式次数为 − 1 -1 1。常用 f ( x ) , g ( x ) , ⋯ f(x),g(x),\cdots f(x),g(x),表示多项式。数域 P P P上所有次数小于 n ∈ n\in nℕ的一元多项式构成的集合记为 P [ x ] n P[x]_n P[x]n。系数序列 [ a 0 , a 1 , ⋯   , a n − 1 ] [a_0,a_1,\cdots,a_{n-1}] [a0,a1,,an1]确定了 f ( x ) = a 0 + a 1 x + ⋯ + a n − 1 x n − 1 ∈ P [ x ] n f(x)=a_0+a_1x+\cdots+a_{n-1}x^{n-1}\in P[x]_n f(x)=a0+a1x++an1xn1P[x]n。希望用Python根据存储在数组a中的系数序列,输出表示对应的多项式表达式的字符串:
a[0]+a[1]・x+a[2]・x**2+ … … +a[n-1]・x**(n-1) \text{a[0]+a[1]・x+a[2]・x**2+……+a[n-1]・x**(n-1)} a[0]+a[1]x+a[2]x**2+……+a[n-1]x**(n-1)
其中,a[i]表示多项式的第i次项系数 a i a_i ai在数组a中的第i个元素值。约定:零多项式的系数序列为空“[ ]”。
:解决本问题需考虑如下几个关键点:

  1. 零多项式需特殊处理;
  2. 常数项,也就是0次项不带变元x的幂;
  3. 1次项的变元x不带幂指数a[1]・x;
  4. 负系数自带与前项的连接符“ − - ”,非负项系数需在前加入连接符“ + + +”;
    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行将表达式串初始化为空串’ ‘。第6~19行的if-else分支语句根据a的长度是否为0分别处理零多项式和非零多项式。对于零多项式,第7行直接将单字符串’0’添加到空串s之后。处理非零多项式的第9~19行的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 12x+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的项。
写博不易,敬请支持:
如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!
代码诚可贵,原理价更高。若为AI学,读正版书好

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值