24小时热门版块排行榜    

查看: 935  |  回复: 0

灵水墨

新虫 (正式写手)

[交流] 多项式g,f,在模p意义下的最大公因数, 程序计算

const { trace } = require("console";

function gcdModP(g, f, p) {
  let d = g.slice(); // 复制 g(x) 的系数到 d(x) 数组中
  let r = f.slice(); // 复制 f(x) 的系数到 r(x) 数组中
  while (!isZeroPoly(r)) {
    let t = trim(d);

    if (t.length < r.length) {
      [t, r] = [r, t]
    }
    // 复制 d(x) 的系数到 t(x) 数组中
    for (let i = 0; i < r.length; i++) {
      let j1 = t.length - r.length + i;
      t[j1] = t[j1] || 0n
      let quotient = (t[j1] * modInverse(r, p)) % p; // 计算商
      for (let j = 0; j < r.length; j++) {
        let index = t.length - r.length + i + j;
        // console.log(index)
        t[index] = t[index] || 0n
        t[index] -= quotient * r[j]; // 更新 t(x) 的系数
        t[index] = (t[index] % p + p) % p; // 取模
      }
      // console.log(t);
    }
    d = r.slice(); // 复制 r(x) 的系数到 d(x) 数组中
    r = t.slice(d.length - r.length + 1); // 复制 t(x) 的系数到 r(x) 数组中
    // console.log(d, r);
    r = trim(r);
  }
  // 将 d(x) 的系数除以它的首项系数,确保它是首项系数为 1 的幂次多项式
  let dLeadingCoefficient = d[d.length - 1];
  for (let i = 0; i < d.length; i++) {
    d = (d * modInverse(dLeadingCoefficient, p)) % p;
  }
  return d;
}

function modInverse(a, p) {
  // 使用扩展欧几里得算法计算 a 在模 p 意义下的逆元
  let [x, y] = extendedEuclideanAlgorithm(a, p);
  return (x % p + p) % p;
}

function extendedEuclideanAlgorithm(a, b) {
  // 扩展欧几里得算法返回 a 和 b 的最大公因数 d,以及满足 ax + by = d 的整数 x 和 y
  if (b === 0n) {
    return [1n, 0n, a];
  }
  let [x, y, d] = extendedEuclideanAlgorithm(b, a % b);
  return [y, x - (a / b) * y, d];
}



/**
* @param {Array<Number>} array
*/
function trim(array) {
  let i = 0;
  for (; i < array.length; i++) {
    // const element = array[index];
    if (array != 0n) {
      break
    }
  }
  let j = array.length - 1;
  for (; j > 0; j--) {
    // const element = array[index];
    if (array[j] != 0n) {
      break
    }
  }
  return array.slice(i, j + 1)
}
// console.log(trim([0n, 0n, 0n, 0n, 0n, 0n]));

/**
* 判断一个多项式是否为 0。
*
* @param {Array} poly - 待判断的多项式
* @returns {boolean} 是否为 0
*/
function isZeroPoly(poly) {
  for (let i = 0; i < poly.length; i++) {
    if (poly !== 0n) {
      return false;
    }
  }
  return true;
}

test()
function test() {
  // console.log(modInverse(5n, 47n));
  // console.log(trimStart([0n, 0n, 1n, 2n]))

  // 测试用例 1

  let g1 = [6n, 2n];
  let f1 = [17n, 15n];
  let p1 = 7n;
  console.log("结果", gcdModP(g1, f1, p1));


  // // 测试用例 3
  let f3 = [3n, 1n, 3n, 1n];
  let g3 = [3n, 1n]; // 3 + x
  let p3 = 101n;
  console.log("结果3", gcdModP(g3, f3, p3));

  let f4 = [3n, 4n, 4n, 1n];
  let g4 = [3n, 1n]; // 3 + x
  let p4 = 101n;
  console.log("结果4", gcdModP(g4, f4, p4));
}

module.exports = { gcdModP }



多项式g,f,在模p意义下的最大公因数,
结果4为什么是1呀,有人帮忙解答下吗

发自小木虫Android客户端
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 灵水墨 的主题更新
普通表情 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[论文投稿] 售SCI一区文章,我:8O5.5.1.O5.4,科目全,可伽急 +3 2JOx3r2CYEgw 2026-08-22 4/200 2026-08-23 04:04 by OEbVnUOu01ol
[硕博家园] 售SCI一区文章,我:8O5.5.1.O5.4,科目全,可伽急 +3 2JOx3r2CYEgw 2026-08-22 7/350 2026-08-23 03:43 by OEbVnUOu01ol
[考博] 售SCI一区T0P文章,我:8.O55.1.O.54,科目全,可十急 +3 2JOx3r2CYEgw 2026-08-21 9/450 2026-08-23 03:31 by OEbVnUOu01ol
[基金申请] 2026国自然函评费到账 +11 羊腰板 2026-08-21 11/550 2026-08-22 22:03 by lsbin3733
[基金申请] 什么时候开奖? +7 CrisMessi 2026-08-18 8/400 2026-08-22 18:29 by 淀粉搬运工
[教师之家] 售一区SCI文章T0P,我:8O.551.O54,科目全,可十急 +4 2JOx3r2CYEgw 2026-08-21 4/200 2026-08-22 16:52 by sunzitan
[基金申请] 时间戳今天,20号变了 +5 archvillain 2026-08-20 5/250 2026-08-22 06:12 by hui_daxiao
[基金申请] 放榜前的不淡定 40+4 snowwithsea 2026-08-19 14/700 2026-08-21 23:51 by cratir
[基金申请] 建议基金发布提前给出明确的时间点 +10 kulium 2026-08-21 13/650 2026-08-21 21:58 by alongwaytogo
[基金申请] 时间戳又变了 +13 wuchongjun 2026-08-20 19/950 2026-08-21 17:21 by 紫杉醇
[基金申请] 让我中一个面上吧! +11 大萍1987 2026-08-20 13/650 2026-08-21 14:48 by 20120902066
[基金申请] 我面上完蛋了 +7 且听虎啸 2026-08-20 8/400 2026-08-21 12:31 by 酷酷墨镜
[基金申请] 应该是下周三26日公布了吧? +4 哈哈蛤? 2026-08-21 4/200 2026-08-21 10:58 by Vivilian
[论文投稿] 投稿咨询 +5 wwm09 2026-08-17 7/350 2026-08-21 10:11 by 期刊论文帮手
[基金申请] 今天放榜没戏了吧 +9 yuleib84 2026-08-19 11/550 2026-08-21 10:06 by gltch
[基金申请] 基金啊基金 +4 longfie172 2026-08-20 4/200 2026-08-21 08:58 by mark mao
[基金申请] 今天系统多次维护,明天很可能放榜! +10 zju2000 2026-08-16 11/550 2026-08-20 20:02 by cl479861084
[基金申请] 重要消息,中午系统在维护 +11 yuleib84 2026-08-18 12/600 2026-08-20 11:09 by xskun
[基金申请] 今天放榜吗? +14 布布和一二 2026-08-19 15/750 2026-08-19 18:07 by gltch
[基金申请] 朋友圈看到的 +6 wangzilk 2026-08-18 8/400 2026-08-19 10:55 by Haru815
信息提示
请填处理意见