GameMale
登陆 / 注册 搜索

USERCENTER

SEARCHSITE

搜索

查看: 1850|回复: 22
收起左侧

[技术交流] 【python】【原创】找任意次有理系数多项式的有理数根

[复制链接] |关注本帖

邪恶的面具海盗弯钩神秘的红茶冒险用绷带魔法石碑箭术卷轴质量效应三部曲

     楼主| 白冥 发表于 2025-1-19 04:56:31 | 显示全部楼层 |阅读模式 <
    本帖最后由 白冥 于 2025-1-19 05:00 编辑

    ## 1. 概述

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

    源代码:

    from math import gcd
    import itertools
    def polynomials_with_rational_coefficients(*k: list[list[int, int]]):
        rational_roots = []
        leading_coefficient = k[-1]
        constant_term = k[0]
        numerator = constant_term[0]
        denominator = leading_coefficient[1]
        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, [frac[0] ** i, frac[1] ** i]))
                if addition(terms)[0] == 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[int, int]):
        numerator = 0
        denominator = 1
        for frac in r:
            denominator *= frac[1]
        for frac in r:
            numerator += frac[0] * (denominator // frac[1])
            common_factor = gcd(numerator, denominator)
        return [numerator // common_factor,denominator // common_factor]
    def multiplication(*r: list[int, int]):
        numerator = 1
        denominator = 1
        for frac in r:
            numerator *= frac[0]
            denominator *= frac[1]
        common_factor = gcd(numerator, denominator)
        return [numerator // common_factor, denominator // common_factor]
    def division(r_0: list[int,int], r_1: list[int, int]):
        numerator = r_0[0] * r_1[1]
        denominator = r_0[1] * r_1[0]
        if denominator == 0:
            return None
        common_factor = gcd(numerator, denominator)
        return [numerator // common_factor, denominator // common_factor]


    ## 2. 模块功能

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

    ## 3. 函数解析

    ### 3.1 `polynomials_with_rational_coefficients`

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

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

    #### 实现步骤:
    1. **提取常数项和最高次项系数**:
       - `numerator`: 通过 `k[0][0]` 提取常数项的分子。
       - `denominator`: 通过 `k[-1][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([2, 1], [3, 1], [4, 1])  
    # 该函数将返回一个包含多项式 [2/1, 3/1, 4/1] 有理根的列表
    ```

    ### 3.2 `factor`

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

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

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

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

    ### 3.3 `addition`

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

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

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

    #### 示例:
    ```python
    addition([1, 2], [1, 3])  # 返回 [5, 6]
    ```

    ### 3.4 `multiplication`

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

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

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

    #### 示例:
    ```python
    multiplication([1, 2], [1, 3])  # 返回 [1, 6]
    ```

    ### 3.5 `division`

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

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

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

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

    ## 4. 使用示例

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

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

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

    ```python
    # 定义多项式的系数
    polynomials_with_rational_coefficients([4, 1], [3, 1], [2, 1])
    ```

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

    评分

    参与人数 4血液 +10 追随 +4 堕落 +3 收起 理由
    福黎 + 10 + 1 + 1 很给力!
    huakaiwusheng + 1 + 1 很给力!
    SweetUncle + 1 + 1 很给力!
    Henggy + 1 很给力!

    查看全部评分

      收起(3)
    回复

    使用道具 举报

    40x43 隐形➀『不败之花』超人

      huakaiwusheng 发表于 2025-1-19 09:20:43 | 显示全部楼层 <
      泥潭真是卧虎藏龙,每一天在感觉自己在长脑子的同时都在感叹自己真是个小辣鸡
      回复

      举报

      胡子贴纸远行『搓粉团珠』守卫: 坚守眼位邦尼尼吸血魔蝠苏格兰圆脸胖鸡和你一起飞行的皮卡丘兴奋的小伯月影狼

        SweetUncle 发表于 2025-1-19 09:24:39 | 显示全部楼层 <
        回复

        举报

        最终幻想XIV安静的海边刺杀者匕首青鸾杰西·麦克雷启程擎天柱(Peterbilt389)大黄蜂(ChevroletCamaro)妙手空空

          贰狼Awoo 发表于 2025-1-19 09:54:49 | 显示全部楼层 <
          好。。好高端。
          看。。看不懂 qwq,兽人无奈
            收起(2)
          回复

          举报

          近地夜航卡利亚权杖崩朽之青铜龙王夏之歌追忆风物长宜英雄联盟龙腾世纪:审判

            是啊困啊 发表于 2025-1-19 10:16:17 | 显示全部楼层 <
            回复

            举报

            胡子贴纸裸体克里斯虚空之海的鲸黄粱一梦『厢庭望远』【新春限定】果体 隆都市:天际线2永远的克叔業火死鬥实现梦想

              娱乐法师火布偶 发表于 2025-1-19 10:16:49 | 显示全部楼层 <
              Python在实现很多数学算法方面是非常方便的语言了
                收起(1)
              回复

              举报

              胡子贴纸GM村蛋糕【夏日限定】夏日的泰凯斯自定义男从Homunculus『厢庭望远』『搓粉团珠』和你一起飞行的皮卡丘天灾骑士阿努比斯信徒卡利亚权杖

                PURO_ 发表于 2025-1-19 10:39:55 | 显示全部楼层 <
                回复

                举报

                胡子贴纸『厢庭望远』萨菲罗斯龙血指环圣剑艾尔尤因克莱夫・罗兹菲尔德我已倾听,我已感受,我已思考魔法不朽·传奇不熄纯爷们阿齐斯阿帕茶

                  泥潭蘑菇 发表于 2025-1-19 11:05:11 | 显示全部楼层 <
                  当初学Python的时候还记得这个东西,现在已经全忘噜……
                  回复

                  举报

                    咸鱼鱼 发表于 2025-1-19 11:10:10 | 显示全部楼层 <
                    回复

                    举报

                    胡子贴纸克莱夫・罗兹菲尔德巴哈姆特卡利亚权杖虚空之海的鲸丹雀衔五穗,人间始丰登枕套幽灵『落樱缤纷』神奇宝贝大师球

                      2674820557 发表于 2025-1-19 11:10:19 | 显示全部楼层 <
                      回复

                      举报

                      胡子贴纸

                        是阿行嘞 发表于 2025-1-19 11:32:32 | 显示全部楼层 <
                        看不懂...只能膜拜...等血液恢复了再回来给...感觉这个用途很广泛,交给其他代码大佬用吧(惹python都没用过)
                        回复

                        举报

                        女巫之路传说绯红女巫『不败之花』莱因哈特·威尔海姆士兵 76卡利亚权杖

                          Wanda 发表于 2025-1-19 12:04:51 | 显示全部楼层 <
                          这对吗,有点像贤者时刻大家可以来看的XD
                            收起(1)
                          回复

                          举报

                          莱因哈特·威尔海姆辐射:新维加斯寶可夢 Pokémon史莱姆蛋驯化红龙幼崽驯化黑龙幼崽

                            ElisaZero 发表于 2025-1-19 12:14:03 | 显示全部楼层 <
                            不是,给我干哪来了,这还是论坛吗
                            md格式不支持看起来怪怪的,重新排版也太麻烦了
                            回复

                            举报

                              jfj7654 发表于 2025-1-19 14:28:43 | 显示全部楼层 <
                              这个真真是技术股,看不懂,是代码强者
                              回复

                              举报

                              胡子贴纸炙热的格拉迪欧拉斯【夏日限定】夏日的泰凯斯性感男神GM保加利亚妖王自定义男从Homunculus

                                cdcai 发表于 2025-1-19 14:51:42 | 显示全部楼层 <
                                回复

                                举报

                                【夏日限定】夏日的泰凯斯『冰雕马拉橇』裸体克里斯亭亭如盖暗影烈焰『搓粉团珠』人鱼之泪蒂法·洛克哈特

                                  Kaicneg 发表于 2025-1-19 15:05:56 | 显示全部楼层 <
                                  回复

                                  举报

                                  传奇鬼王酒吞童子守卫: 不可选中临危受命可爱黑猫奥兹大陆黑神话:悟空

                                    追光 发表于 2025-1-19 16:26:32 | 显示全部楼层 <
                                    看标题:嗯~看来是关于数学知识的帖子,第一次见围观一下。
                                    看内容:啊?啊?这是?大佬你是程序员在敲代码吗???这跟我知道的有理数不是一个东西啊(ᇂ_ᇂ|||)
                                    不过大佬好厉害,膜拜一下
                                    回复

                                    举报

                                    GM論壇進階勛章GM吸血伯爵月亮提灯柏树枝艾吉奥灵魂残絮聚合法肉乖乖神奇宝贝图鉴

                                      aboab 发表于 2025-1-19 18:18:45 | 显示全部楼层 <
                                      呃呃,这是什么,感觉要长脑子了
                                        收起(1)
                                      回复

                                      举报

                                      TRPG版塊金钱马车守望者徽章永亘环『搓粉团珠』夏日柯基夏尔霍格沃兹魔法学校

                                        福黎 发表于 2025-1-19 21:12:35 | 显示全部楼层 <
                                        回复

                                        举报

                                        没有梦想的咸鱼胡子贴纸

                                          Freeze123 发表于 2025-1-20 02:39:36 | 显示全部楼层 <
                                          回复

                                          举报

                                          您需要登录后才可以回帖 登录 | 立即注册

                                          本版积分规则

                                          关闭

                                          站长公告

                                          【抵制账号违规交易】
                                          【抵制账号违规交易】
                                          请珍惜自己的论坛账号! 本BBS论坛禁止任何形式的账号买卖, 本站亦没有任何账号贩售交易途径!经查证账号为购买/或无法证明账号归属的用户将会被永久封禁。

                                          查看 »

                                          文字版|手机版|小黑屋|GameMale

                                          GMT+8, 2025-5-30 15:21 , Processed in 0.161238 second(s), 142 queries , Redis On.

                                          Copyright © 2013-2025 GameMale

                                          All Rights Reserved.

                                          快速回复 返回列表