在有限域上插值多项式

2023-12-04

我想在有限域中的点上使用 python 插值多项式,并获得具有该域中系数的多项式。 目前我正在尝试使用 SymPy 并专门进行插值(来自sympy.polys.polyfuncs),但我不知道如何强制插值在特定的 gf 中发生。如果没有,可以用另一个模块来完成吗?

编辑:我对 Python 实现/库感兴趣。


SymPy's 插值多边形不支持有限域上的多项式。但是 SymPy 背后有足够的细节来组合有限域的类,并找到拉格朗日多项式以一种残酷直接的方式。

As usual, the elements of finite field GF(pn) are represented by polynomials of degree less than n, with coefficients in GF(p). Multiplication is done modulo a reducing polynomial of degree n, which is selected at the time of field construction. Inversion is done with extended Euclidean algorithm.

The polynomials are represented by lists of coefficients, highest degrees first. For example, the elements of GF(32) are:

[], [1], [2], [1, 0], [1, 1], [1, 2], [2, 0], [2, 1], [2, 2]

空列表代表0。

GF 类,有限域

Implements arithmetics as methods add, sub, mul, inv (multiplicative inverse). For convenience of testing interpolation includes eval_poly which evaluates a given polynomial with coefficients in GF(pn) at a point of GF(pn).

请注意,构造函数用作 G(3, 2),而不是 G(9), - 素数及其幂是单独提供的。

import itertools
from functools import reduce
from sympy import symbols, Dummy
from sympy.polys.domains import ZZ
from sympy.polys.galoistools import (gf_irreducible_p, gf_add, \
                                     gf_sub, gf_mul, gf_rem, gf_gcdex)
from sympy.ntheory.primetest import isprime

class GF():
    def __init__(self, p, n=1):
        p, n = int(p), int(n)
        if not isprime(p):
            raise ValueError("p must be a prime number, not %s" % p)
        if n <= 0:
            raise ValueError("n must be a positive integer, not %s" % n)
        self.p = p
        self.n = n
        if n == 1:
            self.reducing = [1, 0]
        else:
            for c in itertools.product(range(p), repeat=n):
              poly = (1, *c)
              if gf_irreducible_p(poly, p, ZZ):
                  self.reducing = poly
                  break

    def add(self, x, y):
        return gf_add(x, y, self.p, ZZ)

    def sub(self, x, y):
        return gf_sub(x, y, self.p, ZZ)

    def mul(self, x, y):
        return gf_rem(gf_mul(x, y, self.p, ZZ), self.reducing, self.p, ZZ)

    def inv(self, x):
        s, t, h = gf_gcdex(x, self.reducing, self.p, ZZ)
        return s

    def eval_poly(self, poly, point):
        val = []
        for c in poly:
            val = self.mul(val, point)
            val = self.add(val, c)
        return val

PolyRing 类,域上的多项式

这个更简单:它实现多项式的加法、减法和乘法,参考基础字段对系数进行运算。列表反转的情况很多[::-1]因为 SymPy 的惯例是从最高幂开始列出单项式。

class PolyRing():
    def __init__(self, field):
        self.K = field

    def add(self, p, q):
        s = [self.K.add(x, y) for x, y in \
             itertools.zip_longest(p[::-1], q[::-1], fillvalue=[])]
        return s[::-1]       

    def sub(self, p, q):
        s = [self.K.sub(x, y) for x, y in \
             itertools.zip_longest(p[::-1], q[::-1], fillvalue=[])]
        return s[::-1]     

    def mul(self, p, q):
        if len(p) < len(q):
            p, q = q, p
        s = [[]]
        for j, c in enumerate(q):
            s = self.add(s, [self.K.mul(b, c) for b in p] + \
                         [[]] * (len(q) - j - 1))
        return s

插值多项式的构造。

The 拉格朗日多项式是针对列表 X 中的给定 x 值和数组 Y 中的相应 y 值构造的。它是基础多项式的线性组合,X 的每个元素都有一个基础多项式。每个基础多项式都是通过相乘获得的(x-x_k)多项式,表示为[[1], K.sub([], x_k)]。分母是标量,因此更容易计算。

def interp_poly(X, Y, K):
    R = PolyRing(K)
    poly = [[]]
    for j, y in enumerate(Y):
        Xe = X[:j] + X[j+1:]
        numer = reduce(lambda p, q: R.mul(p, q), ([[1], K.sub([], x)] for x in Xe))
        denom = reduce(lambda x, y: K.mul(x, y), (K.sub(X[j], x) for x in Xe))
        poly = R.add(poly, R.mul(numer, [K.mul(y, K.inv(denom))]))
    return poly

使用示例:

K = GF(2, 4) 
X = [[], [1], [1, 0, 1]]                # 0, 1,   a^2 + 1
Y = [[1, 0], [1, 0, 0], [1, 0, 0, 0]]   # a, a^2, a^3
intpoly = interp_poly(X, Y, K)
pprint(intpoly)
pprint([K.eval_poly(intpoly, x) for x in X])  # same as Y

漂亮的打印只是为了避免输出上出现一些与类型相关的装饰。多项式表示为[[1], [1, 1, 1], [1, 0]]。为了提高可读性,我添加了一个函数,将其转换为更熟悉的形式,并带有符号a是有限域的生成器,并且x是多项式中的变量。

def readable(poly, a, x):
    return Poly(sum((sum((c*a**j for j, c in enumerate(coef[::-1])), S.Zero) * x**k \
               for k, coef in enumerate(poly[::-1])), S.Zero), x)

所以我们可以做

a, x = symbols('a x')
print(readable(intpoly, a, x))

and get

Poly(x**2 + (a**2 + a + 1)*x + a, x, domain='ZZ[a]')

这个代数对象不是我们领域的多项式,这只是为了可读的输出。

Sage

作为另一种选择,或者只是另一种安全检查,可以使用lagrange_polynomial来自 Sage 的相同数据。

field = GF(16, 'a')
a = field.gen()
R = PolynomialRing(field, "x")
points = [(0, a), (1, a^2), (a^2+1, a^3)]
R.lagrange_polynomial(points)

Output: x^2 + (a^2 + a + 1)*x + a

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在有限域上插值多项式 的相关文章

随机推荐

  • HTML 文本区域水平滚动

    我想为 HTML 页面中的文本区域提供水平滚动 如果我输入没有换行符的长行 则滚动条应该显示而不换行 一些朋友建议使用overflow y CSS属性 这对我不起作用 我使用的浏览器是 IE 6 和 Mozilla 3 我想出了一种不符合
  • 如何使光标可以输入jtextfield,但为其提供文本的唯一方法是单击按钮?

    我有 jTextfield 和 jButton how to 用户可以单击 jTextfield 鼠标可以在 jtextfield 上进入 退出 但如果用户输入某些内容 它将不会执行任何操作 除了退格键会删除整个文本 当用户单击该按钮时 它
  • 初始化中隐式解包的可选值 - Swift

    当编写一个新的 swift 类时 当 不 使用隐式展开的选项而不是简单的选项时 我仍然不是 100 舒服 据我所知 如果您从未期望它的值为零 则将某些内容分配为隐式解包 并且可选 应该可以 如果它为零 则这是一个异常事件 应该会导致运行时错
  • 当主页视图导航到登录视图时,如何触发登录的useEffect?

    基本上在login我有一个函数可以验证令牌是否存在 如果存在则自动重定向到home视图 否则它将保留在login view Login const Login props gt const loading setLoading useSta
  • 如何编写 lambda 处理程序以将数据发送到 Elasticsearch

    下面是将数据发送到本地Elasticsearch的代码 r Name Dr Christopher DeSimone Specialised and Location Health Name Dr Tajwar Aamir Aamir Sp
  • 使用命令行界面的文件中的整数数量

    如何使用egrep计算文件中整数的数量 我试图将其作为模式发现问题来解决 实际上 我面临着如何表示字符范围 0 9 的问题不断地其中包括开头之前的 空格 和结尾之后的 空格或点 我认为后者可以分别使用 来解决 另外 它之间不应包含点 否则它
  • 将 C++ 代码转换为 C#:SendMessageTimeout()

    首先是 SendMessageTimeout 的文档 http msdn microsoft com en us library windows desktop ms644952 28v vs 85 29 aspx 我有这个 C 代码 我想
  • jQuery AJAX 与传统 true 一起使用好不好?

    首先 我不知道传统在Ajax设置中意味着什么 其次 在ASP MVC中有没有什么情况需要将其设置为true 看名字 估计是要贬值了吧 不是吗 jQuery API 文档 http api jquery com jQuery Ajax jQu
  • 在自托管 ASP.NET Core 微服务中启动多个后台线程

    我在哪里可以创建多个长时间运行的后台线程Self Hosted Self Contained ASP NET Core Microservice谁的生命周期与微服务生命周期相同 因此 从线程检索的信息可以作为对请求的响应发送 尝试了给定的代
  • 将 2d 数组从 PHP 传递到 JavaScript 的最佳方法?

    我想在 JavaScript 代码中使用一个 PHP 数组 我宁愿不做类似的事情对于其中的所有元素 因为它的数量未知 我本来打算做一个 while 循环来将一些数据写入元素中 但目前我似乎找不到一种简单的方法来做到这一点 如何以最简单的方式
  • 带有自定义图像 CSS 代码的复选框不起作用

    我正在尝试将自定义图像添加到复选框 并且我正在使用以下代码 input type checkbox display none input type checkbox label background image url images che
  • 使用 R 上的“高频”包转换 .csv 文件以进行进一步操作

    The highfrequency包已以转换的方式创建 txt and csv文件分别从 NYSE TAQ 和 WRDS TAQ 存入 RDataxts 对象的文件 然后可以通过包轻松操作这些文件 问题是我对 WRDS 数据库的访问权限有限
  • SQL 中是否始终需要 ID 列?

    更具体地说 我创建了一个带有标签系统的新闻模块 由于每个标签都是唯一的 作为管理员 您不允许创建 2 个相同的标签 因此 id 列仍然有用吗 我想不是 但我想知道表演 编号 mews 标题 日期 news id tag id id 标签名
  • 为什么 ARKit 应用程序在几天后停止工作?

    我在 Unity 中为 iOS 开发了一个简单的 ARKit 应用程序 它工作得很好 但有一个奇怪的问题 几天后它就停止工作了 因此 当我点击 iPhone 上的应用程序图标时 它会打开该应用程序一毫秒 然后立即退出 如果我再次重新安装该应
  • 运行 webpack 后 Javascript 函数未定义

    这是我的 webpack config js module exports entry src index js path relative to this file output filename frontEnd bundle js p
  • 版本控制中的项目结构

    我知道在版本控制中至少有 10 种不同的方式来构建项目 我很好奇正在使用的一些方法是什么以及哪些方法适合您 我曾经使用过 SVN TFS 目前 不幸的是 VSS 我见过版本控制的实现非常糟糕 也还可以 但从来都不是很好 为了让事情顺利进行
  • AWS lambda函数无法访问互联网

    我正在运行一个 lambda 函数 我想访问私有数据库服务器和互联网 我可以很好地访问数据库 但无法访问互联网 设置 VPC 10 0 0 0 16 Public Subnet 10 0 0 0 24 NAT Security Group
  • Android 中滚动“突出的顶部应用栏”的应用中的延迟滚动行为

    Current unexpected behaviour Required scrolling behaviour 我在带有滚动 突出的顶部应用栏 的 Android Kotlin 应用程序中遇到了一些意外的滚动行为 所需的行为是内部片段的
  • JavaScript 中变量初始化是否也被提升

    JavaScript 提升让我很困惑 变量初始化是否被提升 我认为它被提升是因为我们在声明和初始化变量之前访问变量 console log a var a 4 undefined undefined undefined 表明变量 a 在代码
  • 在有限域上插值多项式

    我想在有限域中的点上使用 python 插值多项式 并获得具有该域中系数的多项式 目前我正在尝试使用 SymPy 并专门进行插值 来自sympy polys polyfuncs 但我不知道如何强制插值在特定的 gf 中发生 如果没有 可以用