随笔四。。

记录几个函数solve(),roots(),small_roots(),nth_root()

我觉得这几个函数都是用来解方程

solve()

solve()可以用来解方程和方程组,下面进行的测试都是在SageMath当中完成的。Python中库sympy也含有这个函数。

Python中参考:【pyhton解决数学问题】2用python解方程

解单个方程

var('x') # 创建一个名为x的符号变量
f = x^3+2*x^2 == 45 # 相当于x^3+2*x^2-45=0
x = solve(f,x)  # 返回这个方程的所有结果
print(x)
[
x == -1/2*I*sqrt(35) - 5/2,
x == 1/2*I*sqrt(35) - 5/2,
x == 3
]

解方程组

示例一

var('p,q,r') # 创建三个名为p q r的符号变量
n = 105
n1 = 15
n2 = 7
f1 = p*q*r == n
f2 = p+q+r == n1
f3 = 2*p+3*q-4*r == n2
solution = solve([f1,f2,f3],[p,q,r])
print(f"solution = {solution}")
solution = [
[p == 1/12*sqrt(35569) + 277/12, q == -1/14*sqrt(35569) - 143/14, r == -1/84*sqrt(35569) + 179/84],
[p == -1/12*sqrt(35569) + 277/12, q == 1/14*sqrt(35569) - 143/14, r == 1/84*sqrt(35569) + 179/84],
[p == 3, q == 7, r == 5]
]

示例二

var('p,q,r') # 创建三个名为p q r的符号变量
n = 18375
n1 = 15
n2 = 9
f1 = p**3*q**2*r == n
f2 = p+q+r == n1
f3 = p+q-r == n2
solution = solve([f1,f2,f3],[p,q,r])
print(f"solution = {solution}")
solution = [
[p == 13.56625683060109, q == -1.566256830601093, r == 3.0],
[p == 9.191511387163562, q == 2.808488612836439, r == 3.0],
[p == (-1.878884224873671 - 2.50874695246713*I), q == (13.87888422487368 + 2.508746952467128*I), r == (3.000000000000005 - 1.77635683940025e-15*I)],
[p == (-1.878884224873671 + 2.50874695246713*I), q == (13.87888422487367 - 2.508746952467127*I), r == (3.000000000000004 + 2.66453525910038e-15*I)],
[p == 5, q == 7, r == 3]
]

roots()

有限域内解多项式

foots()返回多项式的根及其重数。根的重数是根作为解出现的次数。使用参数multiplicities=False就不会打印重数。

SageMath示例

R = PolynomialRing(QQ, 'x')  # Create a polynomial ring over the rational numbers with variable x
# 等价于 R.<x> = PolynomialRing(QQ)
f = x^3 - 3*x^2 + 3*x - 1  # Define a polynomial
print(f.roots())  # Get its roots and their multiplicities
# 结果
[(1, 3)] # 1是多项式f的一个根,重数是3

QQ代表有理数域,f.roots()返回该多项式在该域中所有的根;ZZ表示整数域

解普通方程

这个用法和solve()是一致的

示例

var('x')
f = x**2+2*x == 15
x = f.roots()
print(x)

# [(3, 1), (-5, 1)]

small_roots()

small_roots()SageMath中一个运用了coppersmith定理的函数。它只能解有限域内的方程。

small_soots()主要用于有限域中寻找小根(一些绝对值比较小的根)
small_roots(X = ,beta = )有两个参数,X代表所需要求解根的上限,一般来说取在给定条件下的最大求解上限;beta代表了所寻找的根的预期大小和可能的最大大小之间的比例.当p,q二进制位数相同时一般只能取0.4;如果p,q二进制位数不同,就要具体分析

示例

n = 108960799213330048807537253155955524262938083957673388027650083719597357215238547761557943499634403020900601643719960988288543702833581456488410418793239589934165142850195998163833962875355916819854378922306890883033496525502067124670576471251882548376530637034077
e = 3359917755894163258174451768521610910491402727660720673898848239095553816126131162471035843306464197912997253011899806560624938869918893182751614520610693643690087988363775343761651198776860913310798127832036941524620284804884136983215497742441302140070096928109039
R.<d> = PolynomialRing(Zmod(n))
f = e*d - 251
res = f.monic().small_roots(X = 2^256,beta = 0.44)  # d = random.getrandbits(256)
print(res)

# [39217838246811431279243531729119914044224429322696785472959081158748864949269]

roots()small_roots()的区别在于前者返回所有根,运算速度较慢;而后者返回一些较小的根,运算速度较快一些,且使用small_roots()时多项式必须首一化

nth_root()

nth_root(r,all = True)通常配合着整数环使用,结果返回在整数环中所有的r次方根。

先介绍一下整数环Zmod(n)

Zmod(n)定义了一个模数n的整数环。可以理解为是一个集合,其中的元素都是模n下的余数,即都属于[0,n-1]这个范围。

看个例子

R = Zmod(5)   # 创建一个模 5 的整数环
a = R(3)      # 创建一个模 5 下的元素,其值为 3
b = R(4)      # 创建一个模 5 下的元素,其值为 4

c = a + b     # 在模 5 下进行加法运算
print(c)      # 输出结果为 2

示例

n = 17  # 选择一个模数
R = Zmod(n) # 创建一个模n的整数环
m = 4
element = R(m) # 相当于element = m mod n

roots = element.nth_root(100, all=True) # 返回x^100 = m mod n的所有根
print(roots)
'''
# 等价于
n = 17  # 选择一个模数
m = 4
roots = Zmod(n)(m).nth_root(100,all = True)
print(roots)'''

# [10, 11, 7, 6]
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Mathcad 是一种功能强大的数学软件,它可以让我们非常方便地进行数学计算和分析。学习使用Mathcad 对我来说是一种挑战,但同时也是一次非常有意义的经历。 首先,通过学习Mathcad,我深刻认识到数学公式和计算的重要性。在过去,我常常依赖计算器和纸笔进行数学计算,但这种方式往往效率不高,并且难以避免出错。而Mathcad 提供了一个直观且可视化的界面,让我们可以更加直观地理解和应用数学原理。 其次,学习Mathcad 也提高了我的数学建模和问题解决能力。在学习过程中,我发现Mathcad 的强大之处在于它能够将数学公式和实际问题相结合。通过输入不同的数学公式和数据,我可以揭示和解决一些实际世界中的问题,例如电路分析、力学运动、概率统计等,这为我提供了宝贵的数学建模实践经验。 此外,通过学习Mathcad,我也掌握了一种全新的数学表达方式。通过使用Mathcad的函数和符号库,我可以更加准确地表达数学概念和计算过程。这种表达方式简洁明了,易于理解和阅读,有助于提高我的数学思维能力和表达能力。 尽管学习Mathcad可能会遇到一些挑战,例如复杂的函数和符号操作,对于初学者来说不太友好,但通过不断实践和学习,我相信我可以克服这些问题,并不断进步。 总的来说,学习Mathcad 是一次充满挑战和收获的过程。它帮助我提高了数学知识和技能,提升了我的数学建模和问题解决能力。我相信在未来的学习和工作中,Mathcad 将成为我强大的数学工具。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值