数学:逆元,同余

逆元,同余

  • 0.引言
  • 1.同余
    • 1.1 同余的基本性质
    • 1.2 解同余线性方程
  • 2.逆元
    • 费马小定理求逆元(m必需为质数)
    • 扩展欧几里得求逆元(使用任意互质的a和m)

0.引言

本文讲述什么是逆元,如何求逆元。求逆元的两种常规方法。然后知道同余是求逆元的前置知识。所以先说同余,再说逆元。关于求模,看我这篇文章求模。

1.同余

定义:若两个整数 a a a b b b 除以正整数 m m m 的余数 r r r 相同,则称作 a a a b b b 同模,记作 a ≡ b ( m o d m ) a \equiv b\;(mod\;m) ab(modm)
等价描述: m m m整除 a − b a-b ab,即 m ∣ ( a − b ) m|(a-b) m(ab)

示例:

  • 13 ÷ 12 = 1....1 , 1 ÷ 12 = 0....1 13 \div12=1....1,1\div12=0....1 13÷12=1....11÷12=0....1,两个余数都是1,所以 13 ≡ 1 ( m o d 12 ) 13 \equiv1\;(mod\;12) 131(mod12)
  • 25 ÷ 7 = 3....4 , 11 ÷ 7 = 1....4 25\div7=3....4,11\div7=1....4 25÷7=3....411÷7=1....4,两个余数都是4,所以 25 ≡ 7 ( m o d 4 ) 25\equiv 7\;(mod \;4) 257(mod4)

1.1 同余的基本性质


等价关系性质:
  • 自反性:对于任意整数a,有 a ≡ a ( m o d m ) a \equiv a\;(mod\;m) aa(modm)
  • 对称性:若 a ≡ b ( m o d m ) , a\equiv b\;(mod\;m), ab(modm) b ≡ a ( m o d m ) b\equiv a\;(mod\;m) ba(modm)
  • 传递性:若 a ≡ b ( m o d m ) a \equiv b \pmod{m} ab(modm) b ≡ c ( m o d m ) b \equiv c \pmod{m} bc(modm),则 a ≡ c ( m o d m ) a \equiv c \pmod{m} ac(modm)

代数运算性质:

a ≡ b ( m o d m ) , c ≡ d ( m o d m ) ; a \equiv b\;(mod\;m),c\equiv d\;(mod\;m); ab(modm)cd(modm);

  • 加减性: a + c ≡ b + d ( m o d m ) a+c \equiv b+d\;(mod\;m) a+cb+d(modm) a − c ≡ b − d ( m o d m ) a-c \equiv b-d\;(mod\;m) acbd(modm)
  • 乘法性: a ⋅ c ≡ b ⋅ d ( m o d m ) a \cdot c\equiv b\cdot d\;(mod\;m) acbd(modm)
  • 幂次性:若n为正整数,则 a n ≡ b n ( m o d m ) a^n\equiv b^n\;(mod\;m) anbn(modm)
  • 除法性:若 a ⋅ c ≡ b ⋅ c ( m o d m ) , a\cdot c\equiv b\cdot c\;(mod\;m), acbc(modm), g c d ( c , m ) = d gcd(c,m)=d gcd(c,m)=d,则 a ≡ b ( m o d m d ) a \equiv b\;(mod\;\frac{m}{d}) ab(moddm)

同余类和剩余系:

  1. 同余类(剩余类):模m同余的所有整数构成一个集合,叫做模m的一个同余类。例如,模2时,所有的偶数都属于同余类 [ 0 ] 2 [0]_2 [0]2,所有的奇数都属于同余类 [ 1 ] 2 [1]_2 [1]2。一般的,模m有m个不同的剩余类,也就是同余类,分别是: [ 0 ] m , [ 1 ] m , [ 2 ] m . . . . [ m − 1 ] m [0]_m,[1]_m,[2]_m....[m-1]_m [0]m[1]m[2]m....[m1]m
  2. 完全剩余系:从每个模 m 的同余类中各取一个数组成的集合,称为模 m 的完全剩余系。例如,模 4 的一个完全剩余系可为 { 0 , 1 , 2 , 3 } \{0, 1, 2, 3\} {0,1,2,3},或 { 5 , − 2 , 7 , 10 } \{5, -2, 7, 10\} {5,2,7,10}(每个数模 4 余 0,1,2,3)。
  3. 简化剩余系(缩系):若同余类中的数与 m 互质,则称该类为简化同余类。从所有简化同余类中各取一个数组成的集合,称为模 m 的简化剩余系,其元素个数为欧拉函数 φ ( m ) \varphi(m) φ(m)。例如,模 6 时,与 6 互质的数为 1,5,故简化剩余系为 { 1 , 5 } \{1, 5\} {1,5} φ ( 6 ) = 2 \varphi(6)=2 φ(6)=2。(不知道什么是欧拉函数的看我这篇博客—还没写)

1.2 解同余线性方程

问题描述:有: a x ≡ b ( m o d m ) ax \equiv b \pmod{m} axb(modm),且 a , b , m a,b,m abm都是整数, m > 0 m>0 m>0,求解 x x x
问题等价于求解 a x + m y = b ax+my=b ax+my=b。其中 (x, y) 是整数解。这是因为 a x ≡ b ( m o d m ) ax \equiv b \pmod{m} axb(modm) 意味着 ax 与 b 的差是 m 的倍数,即存在整数 y 使得 a x − b = m y ax - b = my axb=my,整理后得到 a x + m y = b ax + my = b ax+my=b

下面为解决这个问题步骤:

1.解的存在性
2.使用扩展欧几里算出贝祖系数然后求特解(所以先会介绍这个算法是什么)
3.由特解算通解

  1. 解的存在性(必要性):设 d = g c d ( a , m ) d=gcd(a,m) d=gcd(a,m),方程有解当且仅当 d 整除 b1,记作 ( d ∣ b ) (d \mid b) (db)

证明:首先 a x ≡ b ( m o d m ) ax \equiv b \pmod{m} axb(modm)的等价形式为 a x − b = k m ax-b=km axb=km
a x − b = k m ax-b=km axb=km,则 a x − k m = b ax-km=b axkm=b,d 是 a 和 m 的公约数,即存在整数 a ′ = a / d , m ′ = m / d a' = a/d,m' = m/d a=a/dm=m/d,使得 a = d a ′ , m = d m ′ a = d a',m = d m' a=dam=dm,且 gcd ⁡ ( a ′ , m ′ ) = 1 \gcd(a', m') = 1 gcd(a,m)=1
a = d a ′ , m = d m ′ a = d a',m = d m' a=dam=dm 代入上式: d a ′ x − d m ′ k = b ⇒ d ( a ′ x − m ′ k ) = b d a' x - d m' k = b \quad \Rightarrow \quad d(a' x - m' k) = b daxdmk=bd(axmk)=b
由于 a ′ x − m ′ k a' x - m' k axmk 是整数,记为 t,则 b = d t b = d t b=dt,即 d ∣ b d \mid b db

  1. 扩展欧几里得算法

    扩展欧几里得算法是欧几里得算法(辗转相除法)的扩展,其核心目标是:对于给定的整数 a 和 b,不仅计算它们的最大公约数 d = gcd ⁡ ( a , b ) d = \gcd(a, b) d=gcd(a,b),还找到整数 x 和 y,使得: a x + b y = d ax + by = d ax+by=d其中,整数对 ( x , y ) (x, y) (x,y) 称为贝祖系数
    扩展欧几里得算法不仅能计算 g c d ( a , m ) gcd(a, m) gcd(a,m),还能找到整数 x 0 x_0 x0 y 0 y_0 y0,使得: a ⋅ x 0 + m ⋅ y 0 = gcd ⁡ ( a , m ) a \cdot x_0 + m \cdot y_0 = \gcd(a, m) ax0+my0=gcd(a,m)若 b 是 gcd ⁡ ( a , m ) \gcd(a, m) gcd(a,m) 的倍数(即 b = d ⋅ k b = d \cdot k b=dk,其中 d = gcd ⁡ ( a , m ) d = \gcd(a, m) d=gcd(a,m),则原方程的一个特解为: x = x 0 ⋅ k 和 y = y 0 ⋅ k x = x_0 \cdot k \quad \text {和} \quad y = y_0 \cdot k x=x0ky=y0k

什么是贝祖系数?先看贝祖定理

贝祖定理:对于任意整数 a 和 b,存在整数 x 和 y,使得 a x + b y = gcd ⁡ ( a , b ) ax + by = \gcd(a, b) ax+by=gcd(a,b)。特别地,当 a 和 b 互质时,存在 x 和 y 使得 a x + b y = 1 ax + by = 1 ax+by=1


如何求解?

欧几里得算法基于递归式 gcd ⁡ ( a , b ) = gcd ⁡ ( b , a m o d b ) \gcd(a, b) = \gcd(b, a \mod b) gcd(a,b)=gcd(b,amodb),而扩展算法在计算 GCD 的同时,通过回溯保存每一步的线性组合系数

先说明一下欧几里得算法的基本流程:
下面是欧几里得算法(辗转相除法)

#include<iostream>
using namespace std;int gcd(int a,int b)   //递归     示例 a=24   b=9 
{if(b==0)return a;return gcd(b,a%b);
}int gcd(int a,int b)   //迭代
{while(b!=0){int temp=b;b=a%b;a=temp;}return a;
}

扩展欧几里得算法求贝祖系数:

// 扩展欧几里得算法:求 gcd(a, m) 及贝祖系数 x, y
int extendedGCD(int a, int m, int& x, int& y) //一开始x,y什么值都没有,空
{if (m == 0) //此时gcd(a,0)=a,贝祖系数为x=1,y=0.因为a*1+0*0=a{x = 1;y = 0;return a;}int x1, y1;int gcd = extendedGCD(m, a % m, x1, y1);//m*x1+(a%m)*y1=gcd(m,a%m)//通过递归返回的x1,y1计算当前层的贝祖系数x,yx = y1;y = x1 - (a / m) * y1;return gcd;
}

通过贝祖系数求同余方程特解:

  1. 原同余方程 a x ≡ b ( m o d m ) ax \equiv b \pmod{m} axb(modm) 等价于线性不定方程: a x + m y = b ax + my = b ax+my=b当且仅当 gcd ⁡ ( a , m ) ∣ b \gcd(a, m) \mid b gcd(a,m)b 时,方程有解。此时,记 d = gcd ⁡ ( a , m ) d = \gcd(a, m) d=gcd(a,m),则存在整数 k = b d k = \frac{b}{d} k=db,使得 b = d ⋅ k b = d \cdot k b=dk

  2. 将贝祖等式两边同时乘以 k = b d k = \frac{b}{d} k=db a x 0 ⋅ k + m y 0 ⋅ k = d ⋅ k ax_0 \cdot k + my_0 \cdot k = d \cdot k ax0k+my0k=dk,由于 d ⋅ k = b d \cdot k = b dk=b,代入上式得: a ⋅ ( x 0 ⋅ k ) + m ⋅ ( y 0 ⋅ k ) = b a \cdot (x_0 \cdot k) + m \cdot (y_0 \cdot k) = b a(x0k)+m(y0k)=b,对比原方程 a x + m y = b ax + my = b ax+my=b,可以发现: x ′ = x 0 ⋅ k = x 0 ⋅ b d x' = x_0 \cdot k = x_0 \cdot \frac{b}{d} x=x0k=x0db y ′ = y 0 ⋅ k = y 0 ⋅ b d y' = y_0 \cdot k = y_0 \cdot \frac{b}{d} y=y0k=y0db是原方程的一组整数解,即特解。

通解:
对于同余方程 a ⋅ x ≡ b ( m o d m ) a \cdot x \equiv b \pmod{m} axb(modm),转化为线性方程 a ⋅ x + m ⋅ y = b a \cdot x + m \cdot y = b ax+my=b 后。
特解:通过扩展欧几里得算法求得一组特解 ( x 1 , y 1 ) (x_1, y_1) (x1,y1),满足 a ⋅ x 1 + m ⋅ y 1 = b a \cdot x_1 + m \cdot y_1 = b ax1+my1=b
通解:所有解可表示为: x = x 1 + k ⋅ m d , y = y 1 − k ⋅ a d ( k ∈ Z ) x = x_1 + k \cdot \frac{m}{d}, \quad y = y_1 - k \cdot \frac{a}{d} \quad (k \in \mathbb{Z}) x=x1+kdm,y=y1kda(kZ)。其中 d = gcd ⁡ ( a , m ) d = \gcd(a, m) d=gcd(a,m)

通解的推导过程:
( x 1 , y 1 ) (x_1, y_1) (x1,y1) ( x 2 , y 2 ) (x_2, y_2) (x2,y2) 是方程的两组解,则: a ⋅ x 1 + m ⋅ y 1 = b 和 a ⋅ x 2 + m ⋅ y 2 = b a \cdot x_1 + m \cdot y_1 = b \quad \text{和} \quad a \cdot x_2 + m \cdot y_2 = b ax1+my1=bax2+my2=b 两式相减得:
a ( x 2 − x 1 ) + m ( y 2 − y 1 ) = 0 ⇒ a ( x 2 − x 1 ) = − m ( y 2 − y 1 ) a(x_2 - x_1) + m(y_2 - y_1) = 0 \quad \Rightarrow \quad a(x_2 - x_1) = -m(y_2 - y_1) a(x2x1)+m(y2y1)=0a(x2x1)=m(y2y1)
两边除以 d = gcd ⁡ ( a , m ) d = \gcd(a, m) d=gcd(a,m),得: a d ( x 2 − x 1 ) = − m d ( y 2 − y 1 ) \frac{a}{d}(x_2 - x_1) = -\frac{m}{d}(y_2 - y_1) da(x2x1)=dm(y2y1)
由于 a d \frac{a}{d} da m d \frac{m}{d} dm 互质,故 ( x 2 − x 1 ) (x_2 - x_1) (x2x1) 必为 m d \frac{m}{d} dm 的倍数,即: x 2 − x 1 = k ⋅ m d ⇒ x 2 = x 1 + k ⋅ m d x_2 - x_1 = k \cdot \frac{m}{d} \quad \Rightarrow \quad x_2 = x_1 + k \cdot \frac{m}{d} x2x1=kdmx2=x1+kdm
代入原方程得: y 2 = y 1 − k ⋅ a d y_2 = y_1 - k \cdot \frac{a}{d} y2=y1kda

求同余方程特通解:(全部过程代码)

#include <iostream>
#include <vector>
using namespace std;// 扩展欧几里得算法
int extendedGCD(int a, int m, int& x, int& y) {if (m == 0) {x = 1;y = 0;return a;}int x1, y1;int gcd = extendedGCD(m, a % m, x1, y1);x = y1;y = x1 - (a / m) * y1;return gcd;
}// 求解 ax ≡ b (mod m)
vector<int> solveCongruence(int a, int b, int m) {vector<int> solutions;int x, y;int gcd = extendedGCD(a, m, x, y);// 检查解的存在性if (b % gcd != 0) {return solutions; // 无解}// 计算特解并调整到最小非负int x0 = x * (b / gcd);x0 = (x0 % m + m) % m;// 生成所有解int step = m / gcd;for (int k = 0; k < gcd; k++) {solutions.push_back((x0 + k * step) % m);}return solutions;
}int main() {int a = 30, b = 6, m = 24;vector<int> solutions = solveCongruence(a, b, m);if (solutions.empty()) {cout << "无解" << endl;} else {cout << "解为: ";for (int x : solutions) {cout << x << " ";}cout << endl;}return 0;
}

代码难点就是,回溯的时候,子问题的x,y和原问题的x,y是如何置换的?

扩展欧几里得算法的目标是求解贝祖方程 a ⋅ x + b ⋅ y = gcd ⁡ ( a , b ) a \cdot x + b \cdot y = \gcd(a, b) ax+by=gcd(a,b),根据欧几里得算法的递归性质,我们知道: gcd ⁡ ( a , b ) = gcd ⁡ ( b , a m o d b ) \gcd(a, b) = \gcd(b, a \mod b) gcd(a,b)=gcd(b,amodb)
因此,假设子问题: 求解 b ⋅ x ′ + ( a m o d b ) ⋅ y ′ = gcd ⁡ ( b , a m o d b ) b \cdot x' + (a \mod b) \cdot y' = \gcd(b, a \mod b) bx+(amodb)y=gcd(b,amodb)的解为 (x’, y’),则原问题的解 ((x, y)) 与子问题的解存在以下关系:

  1. a m o d b a \mod b amodb a m o d b = a − ⌊ a b ⌋ ⋅ b a \mod b = a - \left\lfloor \frac{a}{b} \right\rfloor \cdot b amodb=abab其中 ⌊ a b ⌋ \left\lfloor \frac{a}{b} \right\rfloor ba 表示 a 除以 b 的商。

  2. 代入子问题的贝祖方程: b ⋅ x ′ + ( a m o d b ) ⋅ y ′ = gcd ⁡ ( b , a m o d b ) b \cdot x' + (a \mod b) \cdot y' = \gcd(b, a \mod b) bx+(amodb)y=gcd(b,amodb)
    替换 a m o d b a \mod b amodb
    b ⋅ x ′ + ( a − ⌊ a b ⌋ ⋅ b ) ⋅ y ′ = gcd ⁡ ( a , b ) b \cdot x' + (a - \left\lfloor \frac{a}{b} \right\rfloor \cdot b) \cdot y' = \gcd(a, b) bx+(abab)y=gcd(a,b)

  3. 整理方程: a ⋅ y ′ + b ⋅ ( x ′ − ⌊ a b ⌋ ⋅ y ′ ) = gcd ⁡ ( a , b ) a \cdot y' + b \cdot (x' - \left\lfloor \frac{a}{b} \right\rfloor \cdot y') = \gcd(a, b) ay+b(xbay)=gcd(a,b)

  4. 对比原问题的贝祖方程: a ⋅ x + b ⋅ y = gcd ⁡ ( a , b ) a \cdot x + b \cdot y = \gcd(a, b) ax+by=gcd(a,b)
    可得:
    x = y ′ , y = x ′ − ⌊ a b ⌋ ⋅ y ′ x = y', \quad y = x' - \left\lfloor \frac{a}{b} \right\rfloor \cdot y' x=y,y=xbay


2.逆元

在模运算中,逆元分为加法逆元和乘法逆元。
这里只介绍乘法逆元.

对于整数a和模数m,若存在整数x满足: a ∗ x ≡ 1 ( m o d m ) a*x \equiv1(mod\;m) ax1(modm)
则称x是a在模m下的乘法逆元,记作 a − 1 m o d m a^{-1} mod\;m a1modm

逆元存在当且仅当a和m互质(gcd(a,m)=1)

为什么需要逆元?
因为在模运算中, a b m o d m \frac{a}{b} mod\;m bamodm 没有定义,所有要把除法转换成乘法,也就是 a b m o d m = b ∗ a − 1 m o d m \frac{a}{b} mod\;m=b*a^{-1} mod\;m bamodm=ba1modm
而求 a − 1 a^{-1} a1 可以通过 a ∗ a − 1 ≡ 1 ( m o d m ) a*a^{-1} \equiv1(mod\;m) aa11(modm) 来求
比如:

计算 6 3 m o d 7 \frac{6}{3} \mod 7 36mod7,等价于 6 ⋅ 3 − 1 m o d 7 6 \cdot 3^{-1} \mod 7 631mod7。由于 3 × 5 = 15 ≡ 1 m o d 7 3 \times 5 = 15 \equiv 1 \mod 7 3×5=151mod7,故 3 − 1 = 5 3^{-1} = 5 31=5,则结果为 6 × 5 = 30 ≡ 2 m o d 7 6 \times 5 = 30 \equiv 2 \mod 7 6×5=302mod7,与实际 6 3 = 2 \frac{6}{3}=2 36=2 一致。

下面是两种方法求逆元


费马小定理求逆元(m必需为质数)

证明看我这篇文章除法求模
原理:若 m 是质数,且 a 不是 m 的倍数,则根据费马小定理: a m − 1 ≡ 1 ( m o d m ) a^{m-1} \equiv 1 \pmod{m} am11(modm)两边同乘 a − 1 a^{-1} a1 得: a − 1 ≡ a m − 2 ( m o d m ) a^{-1} \equiv a^{m-2} \pmod{m} a1am2(modm)

long long quick_pow(long long a, long long b, long long mod){long long res = 1;while (b) {if (b & 1) res = res * a % mod;a = a * a % mod;b >>= 1;}return res;
}long long mod_inverse(long long a, long long m) {if (a % m == 0) return -1;  // 逆元不存在return quick_pow(a, m - 2, m);
}

扩展欧几里得求逆元(使用任意互质的a和m)

原理:根据贝祖定理,若 gcd ⁡ ( a , m ) = 1 \gcd(a, m) = 1 gcd(a,m)=1,则存在整数 x , y x, y x,y 使得: a ⋅ x + m ⋅ y = 1 a \cdot x + m \cdot y = 1 ax+my=1两边模 m 得: a ⋅ x ≡ 1 ( m o d m ) a \cdot x \equiv 1 \pmod{m} ax1(modm) 因此 x 即为 a 的逆元。

因为这是贝祖定理的特殊情况,所有操作比较简单。

计算步骤:

  1. 用欧几里得扩展算法求解 a ∗ x + m ∗ y = 1 a*x+m*y =1 ax+my=1 的一组特解
  2. 逆元为 x 0 m o d m x_0 \;mod\;m x0modm
#include <iostream>
using namespace std;// 扩展欧几里得算法
long long exgcd(long long a, long long b, long long &x, long long &y) {if (b == 0) {x = 1;y = 0;return a;}long long d = exgcd(b, a % b, y, x);y -= a / b * x;return d;
}// 求逆元
long long mod_inverse(long long a, long long m) {long long x, y;long long d = exgcd(a, m, x, y);if (d != 1) return -1;  // 逆元不存在return (x % m + m) % m;  // 确保结果为正
}int main() {long long a = 3, m = 7;long long inv = mod_inverse(a, m);cout << "3的逆元模7是: " << inv << endl;  // 应输出5return 0;
}

  1. 若存在整数 k,使得 b = d × k b = d \times k b=d×k,则称 “d 整除 b”,记作 d ∣ b d \mid b db。此时,d 是 b 的约数(因数),b 是 d 的倍数。 ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/86351.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/86351.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

广州华锐互动:技术与创意双驱动的 VR 先锋​

广州华锐互动能够在众多 VR 公司中崭露头角&#xff0c;离不开其强大的技术实力和源源不断的创意灵感 。在技术研发方面&#xff0c;广州华锐互动组建了一支专业的技术团队&#xff0c;团队成员均具备扎实的技术功底和丰富的行业经验&#xff0c;他们专注于 VR、AR、3D 等核心技…

教育培训教学通用PPT模版

教育培训通用PPT模版&#xff0c;儿童教育PPT模版&#xff0c;公开课件教学PPT模版&#xff0c;读书笔记PPT模版&#xff0c;古风PPT模版&#xff0c;教育教学通用PPT模版 教育培训教学通用PPT模版&#xff1a;https://pan.quark.cn/s/6c2ed020e398

Data Vault 初探(五) —— 定期装载_SQL

说明&#xff1a; 1. 定期装载的周期为每天一次。 2. 每天装载自上次装载后的变化数据 3. 建立源数据库的过渡表用于CDC 4. 建立cdc_time表用于基于时间戳的CDC 5. 因为源库上只有订单销售表有时间属性&#xff0c;所以除了sales_order和sales_order_item拉取变化数据外&#x…

Java虚拟机栈(JVM Stack)详解与工作流程分析

Java虚拟机栈&#xff08;JVM Stack&#xff09;详解与工作流程分析 1. 虚拟机栈核心概念 基本特性 线程私有&#xff1a;每个线程在创建时都会分配一个独立的栈存储内容&#xff1a; 栈帧&#xff08;Stack Frame&#xff09;&#xff1a;每个方法调用对应一个栈帧 生命周期…

Sonarqube:Jenkins触发sonar扫描出现UnsupportedClassVersionError错误处理

文章目录 1、问题现象2、问题根因3、解决思路3.1 解决思路13.2 解决思路23.3 解决思路3 1、问题现象 问题现象&#xff1a;在每次Jenkins触发sonar扫描时&#xff0c;Sonar-scanner扫描器执行都会出现UnsupportedClassVersionError异常&#xff0c;如下&#xff1a; ERROR: …

Spark SQL to_json 函数介绍

目录 前言函数介绍参数说明示例 前言 在Apache Hive中&#xff0c;并没有内置的to_json函数。在Apache Spark SQL中确实有to_json函数,它可以用来将结构化数据&#xff08;如结构化类型或MAP类型&#xff09;转换为JSON字符串。这个功能对于需要将表格数据输出为JSON格式的场景…

《解锁前端潜力:自动化流程搭建秘籍》

当项目逐渐从萌芽走向繁茂&#xff0c;中期阶段对流程优化与效率提升的需求便愈发迫切。搭建一套自动化测试、持续集成与部署的完整流程&#xff0c;已然成为突破瓶颈、保障代码质量与上线效率的关键密钥。这不仅是技术的进阶&#xff0c;更是思维与协作模式的革新。在踏上构建…

计算机体系结构中的片上系统SoC是什么?

计算机体系结构中的片上系统SoC是什么&#xff1f; 片上系统&#xff08;SoC&#xff0c;System on Chip&#xff09; 是一种将计算机或其他电子系统的多个关键组件集成到单一芯片上的集成电路设计。它不仅仅是处理器&#xff08;CPU&#xff09;&#xff0c;而是将处理器、内…

linux虚拟机基础-磁盘扩容详细版本模拟实验

扩容实验参考上一篇博客&#xff1a; https://blog.csdn.net/wenxiaocsdn/article/details/141932877?spm1001.2014.3001.5502 LVM基础知识附录红帽官方文档 配置和管理逻辑卷 | Red Hat Enterprise Linux | 8 | Red Hat Documentation LVM逻辑结构图 LVM 管理命令速查表&…

hbase高可用部署

要实现HBase集群的高可用部署&#xff08;High Availability, HA&#xff09;&#xff0c;核心在于消除单点故障&#xff08;特别是HMaster节点&#xff09;&#xff0c;并确保数据冗余和服务自动恢复。以下是、关键步骤和配置要点&#xff1a; 一、核心配置步骤‌ ‌1.1 启用…

STM32F103ZET6开发板【项目工程创建】+具体实现步骤流程

硬件介绍 芯片为STM32F103ZET6 STM32F103 资源简介 STM32 的优异性 1&#xff0c;超低的价格。8 位机的价格&#xff0c;32 位机的性能&#xff0c;是 STM32 最大的优势。 2&#xff0c;超多的外设。STM32 拥有包括&#xff1a;FMC、TIMER、SPI、IIC、USB、CAN、IIS、SDIO、…

CyberGlove触觉反馈手套遥操作机器人灵巧手解决方案

CyberGlove触觉反馈手套确实可以实时捕捉运动信号和触觉反馈&#xff0c;并将其重新定位到人形机器人上。CyberGlove触觉反馈手套遥操作机器人是通过手套上的传感器捕捉手部动作&#xff0c;将信号传输给机器人&#xff0c;同时接收机器人反馈的触觉信息&#xff0c;实现远程操…

[C#]C# winform部署yolov13目标检测的onnx模型

yolov13官方框架&#xff1a;github.com/iMoonLab/yolov13/releases/tag/yolov13 【测试环境】 vs2019 netframework4.7.2 opencvsharp4.8.0 onnxruntime1.16.3 【效果展示】 【调用代码】 using System; using System.Collections.Generic; using System.ComponentMode…

创客匠人 AI 赋能:创始人 IP 打造的效率革命与信任重构

在注意力经济时代&#xff0c;创始人 IP 面临内容生产效率与信任构建的双重挑战。创客匠人 2025 年战略升级为 “IP 变现整体解决方案服务商”&#xff0c;其推出的 AI 销售信、免训数字人、智能客服三大工具&#xff0c;正通过技术重构破解行业痛点&#xff0c;为知识变现开辟…

飞轮储能VSG控制策略辅助双馈风机一次调频的仿真模型研究

以下是为您撰写的《飞轮储能VSG控制策略辅助双馈风机一次调频的仿真模型研究》技术报告,包含完整的理论分析、控制策略设计及MATLAB/Simulink仿真实现细节: 飞轮储能VSG控制策略辅助双馈风机一次调频的仿真模型研究 摘要 针对双馈感应发电机(DFIG)参与电网一次调频时存在…

临床开发计划:从实验室到市场的战略蓝图

一、临床开发计划概述 1.1 定义与重要性 1.1.1 CDP核心定义 临床开发计划(CDP)是药物、生物制品或医疗器械从实验室走向市场的核心路线图,详细规划临床研究及其策略、时间表和资源需求,以满足监管机构审批要求。 1.1.2 指导意义 CDP为开发团队提供清晰指引,指导资源规划…

【大模型实战】微调Qwen2.5 VL模型,增强目标检测任务。

文章目录 制作数据集使用微调的模型制作数据集 制作数据集 这个章节将详细解析一个将Labelme标注数据集转换为Qwen2.5-VL模型训练格式的Python脚本。该工具实现了图像大小调整、边界框坐标转换和数据格式标准化等功能。生成适用Qwen2.5-VL的数据集。 核心功能概述 图像处理&a…

【python实用小脚本-118】基于Flask的用户认证系统:app.py、forms.py与user.py解析

在当今的网络应用中&#xff0c;用户认证是一个不可或缺的功能。无论是社交平台、电商平台还是企业管理系统&#xff0c;都需要确保只有授权用户才能访问特定的资源。本文将详细介绍一个基于 Flask 框架的用户认证系统&#xff0c;该系统由三个主要文件组成&#xff1a;app.py、…

phpstudy apache伪静态.htaccess文件置空丢失问题解决

phpstudy apache伪静态.htaccess文件置空丢失 在使用phpstudy本地部署项目的时候&#xff0c;创建网站-根目录选择public等运行目录&#xff0c;并且点击确认后&#xff0c;会碰到原本项目中的apache伪静态.htaccess文件被置空丢失的问题&#xff0c;导致项目无法正常访问。 解…

【thinkphp5】Session和Cache记录微信accesstoken

记录一个项目实际遇到的坑&#xff0c;不要把token存放在session&#xff0c;要存在在cache里面&#xff01;&#xff01; 因为Session并不能设置expire过期时间&#xff0c;Session::set()方法第三个参数是作用域&#xff0c;而非过期时间&#xff01;&#xff01;&#xff0…