白冥 发表于 2025-1-19 04:56:31

【python】【原创】找任意次有理系数多项式的有理数根

本帖最后由 白冥 于 2025-1-19 05:00 编辑

## 1. 概述

本贴主要给大家介绍一个包含多项式操作的 Python 代码模块。该模块包含了多个函数,旨在为给定多项式计算有理根。通过输入多项式的系数,函数 `polynomials_with_rational_coefficients` 可以求出该多项式的所有有理根。

源代码:

from math import gcd
import itertools
def polynomials_with_rational_coefficients(*k: list]):
    rational_roots = []
    leading_coefficient = k[-1]
    constant_term = k
    numerator = constant_term
    denominator = leading_coefficient
    p_factors = set(factor(numerator)) + set(1)
    q_factors = set(factor(denominator)) + set(1)
    p_factors = set(p_factors) + set([-p for p in list(p_factors)])
    q_factors = set(q_factors) + set([-q for q in list(q_factors)])
    fracs = list(itertools.product(p_factors, q_factors))
    for frac in fracs:
      terms = []
      for i in range(len(k)):
            terms.append(multiplication(k, ** i, frac ** i]))
            if addition(terms) == 0:
                rational_roots.append(frac)
    return rational_roots
def factor(number: int):
    if number == 0:
      return []
      factors = []
    if number < 0:
      factors.append(-1)
      number = -number
    if number % 2 == 0:
      factors.append(2)
    while number % 2 == 0:
      number //= 2
      divisor = 3
    while divisor * divisor <= number:
      if number % divisor == 0:
            factors.append(divisor)
            while number % divisor == 0:
                number //= divisor
      divisor += 2
    if number > 1:
      factors.append(number)
    return factors
def addition(*r: list):
    numerator = 0
    denominator = 1
    for frac in r:
      denominator *= frac
    for frac in r:
      numerator += frac * (denominator // frac)
      common_factor = gcd(numerator, denominator)
    return
def multiplication(*r: list):
    numerator = 1
    denominator = 1
    for frac in r:
      numerator *= frac
      denominator *= frac
    common_factor = gcd(numerator, denominator)
    return
def division(r_0: list, r_1: list):
    numerator = r_0 * r_1
    denominator = r_0 * r_1
    if denominator == 0:
      return None
    common_factor = gcd(numerator, denominator)
    return

## 2. 模块功能

该模块包含以下主要功能:
- **`polynomials_with_rational_coefficients`**:计算多项式的有理根。
- **`factor`**:对整数进行因式分解。
- **`addition`**:计算两个或更多有理数的和。
- **`multiplication`**:计算两个或更多有理数的积。
- **`division`**:计算两个有理数的商。

## 3. 函数解析

### 3.1 `polynomials_with_rational_coefficients`

#### 功能概述:
该函数的核心作用是计算多项式的有理根。它接受一个或多个包含有理数的列表,每个列表表示多项式的一个系数项。函数根据有理根定理通过测试所有可能的有理根来找到符合条件的解。

#### 参数:
- `k`: 一个或多个包含整数对的列表。每个列表表示多项式的系数,`k` 为常数项系数,`k[-1]` 为最高次项系数。每个系数应由两个整数表示,分别是分子和分母。

#### 实现步骤:
1. **提取常数项和最高次项系数**:
   - `numerator`: 通过 `k` 提取常数项的分子。
   - `denominator`: 通过 `k[-1]` 提取最高次项的分母。

2. **因式分解**:
   - 使用 `factor` 函数获取常数项分子 `numerator` 和最高次项分母 `denominator` 的所有因数。
   - `p_factors`: 常数项分子的因数集合。
   - `q_factors`: 最高次项分母的因数集合。
   - `p_factors` 和 `q_factors` 分别包括正负因数。

3. **生成有理数候选根**:
   - 使用 `itertools.product` 来生成所有可能的有理根(即分子因数和分母因数的所有组合)。

4. **检验每个候选根是否为多项式的根**:
   - 对每个候选有理根 `frac`,通过将其代入多项式并检查多项式值是否为零,来验证该根是否满足条件。
   - 如果满足条件,则将其加入 `rational_roots` 列表。

5. **返回结果**:
   - 返回所有符合条件的有理根。

#### 示例:
```python
polynomials_with_rational_coefficients(, , )
# 该函数将返回一个包含多项式 有理根的列表
```

### 3.2 `factor`

#### 功能概述:
该函数用于对整数进行因式分解,返回一个包含整数因数的列表。

#### 参数:
- `number`: 需要因式分解的整数。

#### 实现步骤:
1. 如果数字为零,直接返回空列表。
2. 如果数字为负数,先将 -1 添加到因数列表中。
3. 对数字进行因式分解,首先处理 2 的倍数,然后用从 3 开始的奇数进行试除,直到数字小于其平方根。
4. 如果分解后的数字大于 1,说明该数字是质数,添加到因数列表。

#### 示例:
```python
factor(12)# 返回
factor(-12) # 返回 [-1, 2, 2, 3]
```

### 3.3 `addition`

#### 功能概述:
该函数用于计算多个有理数的和。每个有理数以分子和分母的形式表示。

#### 参数:
- `*r`: 一个或多个包含两个整数的列表,每个列表表示一个有理数。

#### 实现步骤:
1. 首先计算所有有理数的共同分母。
2. 计算所有有理数的分子之和。
3. 返回简化后的分子和分母。

#### 示例:
```python
addition(, )# 返回
```

### 3.4 `multiplication`

#### 功能概述:
该函数用于计算多个有理数的积。

#### 参数:
- `*r`: 一个或多个包含两个整数的列表,每个列表表示一个有理数。

#### 实现步骤:
1. 计算所有有理数的分子和分母的乘积。
2. 返回简化后的分子和分母。

#### 示例:
```python
multiplication(, )# 返回
```

### 3.5 `division`

#### 功能概述:
该函数用于计算两个有理数的商。

#### 参数:
- `r_0`: 第一个有理数,表示为 ``。
- `r_1`: 第二个有理数,表示为 ``。

#### 实现步骤:
1. 计算商的分子和分母。
2. 检查分母是否为零。
3. 返回简化后的商。

#### 示例:
```python
division(, )# 返回
```

## 4. 使用示例

假设我们需要找到以下多项式的有理根:

\[ 2x^2 + 3x + 4 = 0 \]

我们可以通过以下代码实现:

```python
# 定义多项式的系数
polynomials_with_rational_coefficients(, , )
```

该函数将返回所有可能的有理根,若无有理根,则返回空列表。

huakaiwusheng 发表于 2025-1-19 09:20:43

泥潭真是卧虎藏龙,每一天在感觉自己在长脑子的同时都在感叹自己真是个小辣鸡

SweetUncle 发表于 2025-1-19 09:24:39

泥潭这是要成为下一个csdn吗{:6_179:}{:6_179:}5点起来在发算法贴,楼楼继续加油喵{:5_118:}

贰狼Awoo 发表于 2025-1-19 09:54:49

好。。好高端。
看。。看不懂 qwq,兽人无奈

是啊困啊 发表于 2025-1-19 10:16:17

坏了,我在泥潭上大学了:P

娱乐法师火布偶 发表于 2025-1-19 10:16:49

Python在实现很多数学算法方面是非常方便的语言了

PURO_ 发表于 2025-1-19 10:39:55

口瓜,是代码强者!
俺自从考完研之后数学就已经快要还给老师了◑ω◐

泥潭蘑菇 发表于 2025-1-19 11:05:11

当初学Python的时候还记得这个东西,现在已经全忘噜……

咸鱼鱼 发表于 2025-1-19 11:10:10

论坛不支持md格式所以很奇怪了,你这里面全是md的格式标识

2674820557 发表于 2025-1-19 11:10:19

代码用在数学领域真的是很方便了,利用机器的算力顷刻实现复杂的计算过程

是阿行嘞 发表于 2025-1-19 11:32:32

看不懂...只能膜拜...等血液恢复了再回来给...感觉这个用途很广泛,交给其他代码大佬用吧(惹python都没用过)

Wanda 发表于 2025-1-19 12:04:51

这对吗,有点像贤者时刻大家可以来看的XD

ElisaZero 发表于 2025-1-19 12:14:03

不是,给我干哪来了,这还是论坛吗{:6_164:}
md格式不支持看起来怪怪的,重新排版也太麻烦了{:4_114:}

jfj7654 发表于 2025-1-19 14:28:43

这个真真是技术股,看不懂,是代码强者

cdcai 发表于 2025-1-19 14:51:42

大学毕业这么多年了,差点连标题都没看懂{:6_167:}

Kaicneg 发表于 2025-1-19 15:05:56

没有想到在这裡看到数学代码?支持一下{:6_176:}

追光 发表于 2025-1-19 16:26:32

看标题:嗯~看来是关于数学知识的帖子,第一次见围观一下。
看内容:啊?啊?这是?大佬你是程序员在敲代码吗???这跟我知道的有理数不是一个东西啊(ᇂ_ᇂ|||)
不过大佬好厉害,膜拜一下

aboab 发表于 2025-1-19 18:18:45

呃呃,这是什么,感觉要长脑子了

福黎 发表于 2025-1-19 21:12:35

上一次碰python还是在上一次,有点感觉被记忆里的作业踢到脑袋了

Freeze123 发表于 2025-1-20 02:39:36

已收藏,氮素希望期末上机考试不考这个
页: [1] 2
查看完整版本: 【python】【原创】找任意次有理系数多项式的有理数根