首页 > 编程语言 >关于Pohlig-Hellmen算法喵

关于Pohlig-Hellmen算法喵

时间:2023-09-25 19:56:30浏览次数:31  
标签:1p frac Hellmen Pohlig 算法 原根时 equiv mod

\(g^x\equiv a(mod\;p )\)

当\(g\)为原根时

  1. 拆分\(p-1=\prod_{i=1}p_i^{ki}\)

  2. 对于每一个\(p_i\)进行处理

    1. 将\(x\)转化为\(p\)进制数 \(x=c_0+c_1p_i+c_2p_i^2+...+c_{k_i-1}p_i^{k_i-1}\)

    2. \(g^{x( \frac{p-1}{p_i} )}\equiv a^{\frac{p-1}{p_i}}(mod\;p )\)

    3. 用1展开2中的x,发现从\(c_1p_i\)开始的每一项指数都是\(p-1\)的倍数,取余为1,可以扔掉

    4. \(g^{c_0 \frac{p-1}{p_i} }\equiv a^{\frac{p-1}{p_i}}(mod\;p )\) 通过\(BSGS\)求出\(c_0\)

    5. \(g^{x( \frac{p-1}{p_i^2} )}\equiv a^{\frac{p-1}{p_i^2}}(mod\;p )\)

    6. 同理得到\(g^{c_1 \frac{p-1}{p_i^2} }\equiv a^{\frac{p-1}{p_i^2}} inv(g^{c_0 \frac{p-1}{p_i} })(mod\;p )\)通过\(BSGS\)求出\(c_1\)

    7. ...

  3. \(CRT\)搞一下

当不为原根时

\[a^x\equiv b(mod\;p ) \]

\[ \left\{ \begin{matrix} a \equiv g^A (mod \; p) \\ b \equiv g^B (mod \; p) \end{matrix} \right. \]

\[g^{Ax}\equiv g^B(mod \;p) \]

\[Ax\equiv B(mod \; p-1) \]

\(exgcd\)搞一下

标签:1p,frac,Hellmen,Pohlig,算法,原根时,equiv,mod
From: https://www.cnblogs.com/Kuroniko/p/17728714.html

相关文章

  • 【算法】莫队
    一、概念莫队是一种应用于离线询问的优美暴力算法。它是主要思想是让区间的左端点和右端点移动的距离加起来最短。二、实现假设现在有这样一串序列:\(1,1,4,5,1,4\),我们现在要求询问区间内的\(1\)的出现次数。如果我们现在已经统计到了区间\((2,3)\),现在询问\((1,5)\)。现......
  • 文心一言 VS 讯飞星火 VS chatgpt (100)-- 算法导论9.3 6题
    六、用go语言,对一个包含n个元素的集合来说,k分位数是指能把有序集合分成k个等大小集合的第k-1个顺序统计量。给出一个能找出某一集合的k分位数的O(nlgk)时间的算法。文心一言:要找到一个集合的k分位数,可以使用Go语言编写以下算法:packagemainimport("fmt""sort"......
  • [剑指offer] 其他算法[上]篇
    JZ66构建乘积数组/*暴力*/publicclassJZ66_1{publicstaticint[]multiply(int[]A){int[]res=newint[A.length];Arrays.fill(res,1);for(inti=0;i<A.length;i++){for(intj=0;j<A.len......
  • 快速排序/选择算法
    ......
  • 基础双指针算法:单队列、双队列
    1、单队列输入一串字符串,字符串有多个由单个逗号隔开的单词,任务是需要把单词间隔开,每个单词换行输出。输入样例abcdefghi输出样例abcdefghi#include<iostream>usingnamespacestd;constintN=1010;intmain(){charstr[N];#definegets(str)gets_s(str......
  • 9.25算法
    #include<bits/stdc++.h>usingnamespacestd;structListNode{  intval;  ListNode*next;  ListNode():val(0),next(nullptr){}  ListNode(intx):val(x),next(nullptr){}  ListNode(intx,ListNode*next):val(x),next(next){}};......
  • 轻松掌握冒泡排序算法,值得收藏
    冒泡排序(BubbleSort)是一种简单的排序算法,其基本思想是多次遍历待排序的数组,每次比较相邻的两个元素,如果它们的顺序不正确就交换它们,直到整个数组有序为止。冒泡排序的基本步骤如下:从数组的第一个元素开始,比较相邻的两个元素,如果它们的顺序不正确就交换它们。重复步骤1,直到遍历......
  • 本地测试Spark的逻辑回归算法
    本地小数据量测试了一下Spark的LogisticRegressionWithSGD算法,效果不尽如人意。    数据样例如下,竖杠前的0,1代表两种类型,后面逗号隔开的是两个特征,两个特征只要有一个大于等于0.6就会被分为1这一类,否则就是0。1|0.3,0.60|0.2,0.11|0.5,0.61|0.8,0.30|0.4,0.30|0.3,0.......
  • 简单而经典:Java中的冒泡排序算法详解
    当谈到简单的排序算法时,冒泡排序(BubbleSort)通常是其中之一。虽然它不是最高效的排序算法之一,但它的简单性和易于理解使它成为学习排序算法的良好起点。在本文中,我们将详细介绍Java中的冒泡排序。冒泡排序的基本原理冒泡排序(BubbleSort)是一种简单的排序算法,它通过多次遍历待排序的......
  • 【算法】归并排序算法
    归并排序归并排序的思想归并排序运用了典型的分治策略,是一种稳定的排序算法,其时间复杂度为\(O(nlogn)\),空间复杂度为\(O(n)\)。分治的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。......