正十七边形尺规作图证明——从高斯的发现到几何实现

news2025/3/13 4:57:31

正十七边形尺规作图证明——从高斯的发现到几何实现

1. 引言:一个历史性的数学突破

在欧几里得几何中,尺规作图(仅使用直尺和圆规)是最为基础的几何构造方法。古希腊数学家已知如何构造正三角形、正方形和正五边形,但在此之后的正多边形尺规作图问题成为了一个长期悬而未决的数学挑战。

直到1796年,年仅19岁的德国数学天才卡尔·弗里德里希·高斯(Carl Friedrich Gauss)在其著名的日记中写下了一个划时代的发现:正十七边形可以用尺规作图精确构造。这一结果不仅令当时的数学界震惊,更开创了代数结构理论的新篇章。

2. 可构造性的理论基础

高斯的发现并非偶然。他通过深入研究分圆方程,揭示了一个普遍规律:

定理:正n边形可以用尺规作图的充要条件是n可以表示为:
n = 2 k × p 1 × p 2 × ⋯ × p m n = 2^k \times p_1 \times p_2 \times \cdots \times p_m n=2k×p1×p2××pm
其中 p i p_i pi均为不同的费马素数(形如 F n = 2 2 n + 1 F_n = 2^{2^n}+1 Fn=22n+1的素数)。

由于17 = 2 2 2 + 1 = F 2 + 1 2^{2^2}+1 = F_2 + 1 222+1=F2+1是一个费马素数,所以正十七边形可以用尺规作图构造。

3. 高斯的代数证明思路

高斯的证明是通过代数方法进行的,其核心是将复杂的问题分解为更简单的子问题:

  1. 问题转化:构造正十七边形等价于能够精确构造 cos ⁡ ( 2 π 17 ) \cos(\frac{2\pi}{17}) cos(172π)

  2. 分圆多项式:找到 x = cos ⁡ ( 2 π 17 ) x = \cos(\frac{2\pi}{17}) x=cos(172π)所满足的代数方程,即第17阶分圆多项式。

  3. 方程分解:高斯的天才之处在于,他发现这个16次方程可以被分解为一系列嵌套的二次方程。

  4. 构造过程:每个二次方程对应于几何中的一次"开平方"操作,而这恰好可以通过尺规作图实现。

简化来说,高斯证明了 cos ⁡ ( 2 π 17 ) \cos(\frac{2\pi}{17}) cos(172π)可以用嵌套的平方根表示:

cos ⁡ ( 2 π 17 ) = − 1 + 17 + 34 − 2 17 + 2 17 + 3 17 − 34 − 2 17 − 2 34 + 2 17 16 \cos(\frac{2\pi}{17}) = \frac{-1 + \sqrt{17} + \sqrt{34 - 2\sqrt{17}} + 2\sqrt{17 + 3\sqrt{17} - \sqrt{34 - 2\sqrt{17}} - 2\sqrt{34 + 2\sqrt{17}}}}{16} cos(172π)=161+17 +34217 +217+317 34217 234+217

这个表达式虽然复杂,但只涉及有理运算和开平方,因此可以用尺规作图实现。

4. 思维导图:证明结构可视化

下面的思维导图展示了正十七边形尺规作图证明的逻辑结构:

正十七边形尺规作图问题
代数分析
几何实现
构造cos(2π/17)
17阶分圆多项式
高斯分解为嵌套二次方程
证明存在尺规构造解
几何步骤设计
单位圆构造
特殊点确定
垂直平分线作法
确定正十七边形顶点

5. 几何实现:Richmond方法

有多种方法可以实现正十七边形的尺规作图,下面介绍的Richmond方法是比较经典的一种。具体步骤如下:

基本构造过程

  1. 画一个单位圆O,标记圆心为O。
  2. 画水平直径AB和垂直直径CD
  3. 在水平半径OA上取点E,使OE = 1/4 OA。
  4. 以E为圆心、EA为半径画圆,交垂直直径于F和G。
  5. 连接EF和EG,延长EF交单位圆于H。
  6. 作FH的垂直平分线,交单位圆于I和J。
  7. 点I和J即为正十七边形的两个顶点
  8. 用圆规在单位圆上等分出其余顶点
  9. 连接所有顶点,完成正十七边形。

这个作图方法看似简单,但其背后的数学原理极其深刻。每一步操作都精确对应了高斯代数公式中的一部分运算。

6. 代数与几何的对应关系

让我们看一下几何操作与代数计算之间的对应关系:

几何操作代数意义
单位圆构造设定单位长度,准备角度测量
在OA上取点E (OE=OA/4)对应于公式中的常数项
作以E为圆心的圆实现首次"开平方"操作
延长EF至H实现代数式中的"加法"
作FH的垂直平分线对应于公式中的第二次"开平方"
得到点I和J确定第一个角度 cos ⁡ ( 2 π 17 ) \cos(\frac{2\pi}{17}) cos(172π)

每一步几何操作都有精确的代数对应,这种对应关系的发现是高斯天才的体现。

7. 交互式演示工具

为了直观展示正十七边形的尺规作图过程,我创建了一个交互式网页应用。通过这个工具,您可以逐步观察作图过程,理解每一步的几何意义:

这个演示工具允许您:

  • 逐步进行作图,了解每一步的具体操作
  • 观察关键点(O, A, B, C, D, E, F, G, H, I, J)的确定过程
  • 最终看到完整的正十七边形呈现
  • 以下是完整代码:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8" />
  <title>正十七边形尺规作图演示</title>
  <script src="https://cdn.tailwindcss.com"></script>
  <style>
    body {
      font-family: 'Microsoft YaHei', 'SimHei', sans-serif;
    }
    canvas {
      display: block;
      background-color: white;
    }
    .step-container {
      max-height: 240px;
      overflow-y: auto;
    }
  </style>
</head>
<body class="bg-gray-50">
  <div class="container mx-auto py-8 px-4">
    <h1 class="text-3xl font-bold text-center text-indigo-700 mb-8">
      正十七边形尺规作图演示
    </h1>

    <!-- 主要布局 -->
    <div class="bg-white rounded-lg shadow-lg p-4 flex flex-col lg:flex-row">
      <!-- 左侧:画布区域 -->
      <div class="lg:w-2/3 p-2 flex flex-col items-center">
        <canvas
          id="constructionCanvas"
          width="600"
          height="600"
          class="border border-gray-200 rounded-md mb-4"
        ></canvas>
        <!-- 控制按钮 -->
        <div class="flex space-x-4">
          <button
            id="prevBtn"
            class="px-4 py-2 bg-indigo-600 text-white rounded-md hover:bg-indigo-700 disabled:bg-gray-400 disabled:cursor-not-allowed"
          >
            上一步
          </button>
          <button
            id="playBtn"
            class="px-4 py-2 bg-green-600 text-white rounded-md hover:bg-green-700"
          >
            播放
          </button>
          <button
            id="pauseBtn"
            class="px-4 py-2 bg-yellow-600 text-white rounded-md hover:bg-yellow-700"
          >
            暂停
          </button>
          <button
            id="nextBtn"
            class="px-4 py-2 bg-indigo-600 text-white rounded-md hover:bg-indigo-700 disabled:bg-gray-400 disabled:cursor-not-allowed"
          >
            下一步
          </button>
          <button
            id="resetBtn"
            class="px-4 py-2 bg-red-600 text-white rounded-md hover:bg-red-700"
          >
            重置
          </button>
        </div>
      </div>

      <!-- 右侧:步骤说明 -->
      <div class="lg:w-1/3 p-4 bg-gray-50">
        <h2 class="text-xl font-semibold text-indigo-600 mb-3">
          作图步骤
        </h2>
        <div class="step-container border border-gray-200 rounded-lg p-3 bg-white">
          <div id="steps" class="text-sm">
            <p class="font-medium">加载中...</p>
          </div>
        </div>

        <!-- 步骤进度指示 -->
        <div class="mt-6">
          <p class="text-sm text-gray-600">
            当前步骤: 
            <span id="currentStep" class="font-medium">1</span> / 
            <span id="totalSteps" class="font-medium">9</span>
          </p>
          <div class="w-full bg-gray-200 rounded-full h-2.5 mt-2">
            <div
              id="progressBar"
              class="bg-indigo-600 h-2.5 rounded-full"
              style="width: 0%"
            ></div>
          </div>
        </div>
      </div>
    </div>

    <!-- 版权信息 -->
    <div class="mt-4 text-center text-xs text-gray-400">
      © 2025 正十七边形尺规作图演示
    </div>
  </div>

  <script>
    document.addEventListener("DOMContentLoaded", function () {
      const canvas = document.getElementById("constructionCanvas");
      const ctx = canvas.getContext("2d");

      // 画布尺寸
      const width = canvas.width;
      const height = canvas.height;
      const centerX = width / 2;
      const centerY = height / 2;
      // 这里使用200作为“单位圆”半径,为了更清晰
      const r = 200;

      // 按钮
      const prevBtn = document.getElementById("prevBtn");
      const nextBtn = document.getElementById("nextBtn");
      const playBtn = document.getElementById("playBtn");
      const pauseBtn = document.getElementById("pauseBtn");
      const resetBtn = document.getElementById("resetBtn");

      // 步骤显示
      const stepsDiv = document.getElementById("steps");
      const currentStepSpan = document.getElementById("currentStep");
      const totalStepsSpan = document.getElementById("totalSteps");
      const progressBar = document.getElementById("progressBar");

      // 状态
      let currentStep = 0;
      let playInterval = null;
      const playSpeed = 1500; // 毫秒

      // 步骤文案
      const steps = [
        "画一个单位圆 O(这里设半径=200),标记圆心为 O",
        "画水平直径 AB 和垂直直径 CD",
        "在水平半径 OA 上取点 E,使 OE = 1/4 OA",
        "以 E 为圆心、EA 为半径画圆,交垂直直径于 F 和 G",
        "连接 EF 和 EG,延长 EF 并与单位圆相交于 H",
        "作 FH 的垂直平分线,交单位圆于 I 和 J",
        "点 I 和 J 即为正十七边形的两个顶点",
        "用圆规在单位圆上等分其余 15 个顶点",
        "连接所有顶点,完成正十七边形"
      ];
      const totalSteps = steps.length;
      totalStepsSpan.textContent = totalSteps;

      // 关键点坐标(在动画演示中逐步求解)
      // 注意:为了演示简洁,我们使用理想化计算,不考虑小数误差
      // OA 设为半径=200
      // OE = 1/4 OA => OE=50
      let A = { x: centerX + r, y: centerY };
      let B = { x: centerX - r, y: centerY };
      let C = { x: centerX, y: centerY - r };
      let D = { x: centerX, y: centerY + r };
      let O = { x: centerX, y: centerY };

      let E = { x: centerX + 50, y: centerY }; // OE=1/4 OA
      
      // 后面需要的F、G、H、I、J将通过演示过程“动态”绘制

      function clearCanvas() {
        ctx.clearRect(0, 0, width, height);
      }

      // 辅助函数:绘制一个点
      function drawPoint(pt, label, color = "red") {
        ctx.fillStyle = color;
        ctx.beginPath();
        ctx.arc(pt.x, pt.y, 4, 0, 2 * Math.PI);
        ctx.fill();
        if (label) {
          ctx.fillStyle = "#444";
          ctx.font = "14px Arial";
          ctx.fillText(label, pt.x + 8, pt.y + 6);
        }
      }

      // 辅助函数:画线段
      function drawLine(p1, p2, color = "#333", width = 2) {
        ctx.strokeStyle = color;
        ctx.lineWidth = width;
        ctx.beginPath();
        ctx.moveTo(p1.x, p1.y);
        ctx.lineTo(p2.x, p2.y);
        ctx.stroke();
      }

      // 辅助函数:画圆
      function drawCircle(center, radius, color = "#666", width = 2) {
        ctx.strokeStyle = color;
        ctx.lineWidth = width;
        ctx.beginPath();
        ctx.arc(center.x, center.y, radius, 0, 2 * Math.PI);
        ctx.stroke();
      }

      // 根据当前步骤作图
      function drawStep(step) {
        clearCanvas();

        // 先画背景(网格线)
        ctx.strokeStyle = "#f0f0f0";
        ctx.lineWidth = 1;
        for (let y = 0; y < height; y += 50) {
          ctx.beginPath();
          ctx.moveTo(0, y);
          ctx.lineTo(width, y);
          ctx.stroke();
        }
        for (let x = 0; x < width; x += 50) {
          ctx.beginPath();
          ctx.moveTo(x, 0);
          ctx.lineTo(x, height);
          ctx.stroke();
        }

        // 步骤>=0:画单位圆
        drawCircle(O, r, "#3b82f6");

        // 标记O
        drawPoint(O, "O", "#3b82f6");

        if (step >= 1) {
          // 步骤1:画水平直径AB、垂直直径CD
          drawLine(A, B, "#3b82f6");
          drawLine(C, D, "#3b82f6");
          drawPoint(A, "A", "#10b981");
          drawPoint(B, "B", "#10b981");
          drawPoint(C, "C", "#10b981");
          drawPoint(D, "D", "#10b981");
        }

        if (step >= 2) {
          // 步骤2:在OA上取E,使OE=1/4
          drawLine(O, A, "#aaa", 1);
          drawPoint(E, "E", "#ec4899");
        }

        let F = null;
        let G = null;
        let H = null;
        let I = null;
        let J = null;

        if (step >= 3) {
          // 步骤3:以E为圆心, EA为半径画圆,交CD于F、G
          // 半径EA
          const EA = Math.sqrt((A.x - E.x) ** 2 + (A.y - E.y) ** 2);
          drawCircle(E, EA, "#ec4899");

          // 找F、G:这需要计算圆(E,EA)与直线CD的交点
          // CD是x=centerX的竖线
          // 圆(E,EA)方程: (x-Ex)^2 + (y-Ey)^2 = EA^2
          // 直线: x = centerX
          // => (centerX - Ex)^2 + (y - Ey)^2 = EA^2 => 求 y
          const dx = centerX - E.x;
          const a = 1;
          const b = -2 * E.y;
          const c = dx * dx + E.y * E.y - EA * EA;
          // y^2 + b*y + c=0
          // 求根
          const disc = b * b - 4 * a * c;
          // 这里简化写法
          if (disc >= 0) {
            const y1 = ( -b + Math.sqrt(disc) ) / (2 * a);
            const y2 = ( -b - Math.sqrt(disc) ) / (2 * a);
            F = { x: centerX, y: y1 };
            G = { x: centerX, y: y2 };
            // 以Y坐标从小到大排序
            if (F.y > G.y) {
              let tmp = F;
              F = G;
              G = tmp;
            }
            drawPoint(F, "F", "#ef4444");
            drawPoint(G, "G", "#ef4444");
            // 画线EG、EF
            drawLine(E, F, "#ef4444");
            drawLine(E, G, "#ef4444");
          }
        }

        if (step >= 4 && F) {
          // 步骤4:连接 EF 和 EG,延长 EF 交单位圆于 H
          // 求 EF 与单位圆的交点(一种方法:向量或方程)
          // 先只画延长线
          drawLine(E, F, "#ef4444");
          // 我们只找“第二个交点”
          // EF线方程 param: E + t*(F-E)
          let vx = F.x - E.x;
          let vy = F.y - E.y;

          // 单位圆方程 (x-centerX)^2 + (y-centerY)^2 = r^2
          // 令 x = Ex + t*vx, y = Ey + t*vy
          // => (Ex + t*vx - centerX)^2 + (Ey + t*vy - centerY)^2 = r^2
          function solveCircleLineIntersection(E, F, O, r) {
            let vx = F.x - E.x;
            let vy = F.y - E.y;
            // 移到以O为原点的坐标
            let Ex_ = E.x - O.x;
            let Ey_ = E.y - O.y;

            let A_ = vx * vx + vy * vy;
            let B_ = 2 * (Ex_ * vx + Ey_ * vy);
            let C_ = Ex_ * Ex_ + Ey_ * Ey_ - r * r;
            let disc_ = B_ * B_ - 4 * A_ * C_;
            if (disc_ < 0) return [];
            let t1 = (-B_ + Math.sqrt(disc_)) / (2 * A_);
            let t2 = (-B_ - Math.sqrt(disc_)) / (2 * A_);
            let sol1 = { x: E.x + t1 * vx, y: E.y + t1 * vy };
            let sol2 = { x: E.x + t2 * vx, y: E.y + t2 * vy };
            return [sol1, sol2];
          }

          const sol = solveCircleLineIntersection(E, F, O, r);
          // E-F本身是线段,需要延长,所以交点可能有2个
          // E点本身不一定在圆上,所以我们要找离E较远的那个点
          if (sol.length === 2) {
            // 找跟E距离更远的交点
            let d1 = (sol[0].x - E.x) ** 2 + (sol[0].y - E.y) ** 2;
            let d2 = (sol[1].x - E.x) ** 2 + (sol[1].y - E.y) ** 2;
            H = d1 > d2 ? sol[0] : sol[1];
            drawPoint(H, "H", "#ef4444");
            // 真正延长EF到H
            drawLine(E, H, "#ef4444");
          }
        }

        if (step >= 5 && F && H) {
          // 步骤5:作FH的垂直平分线,交单位圆于I和J
          // 1) 找FH中点 M
          let M = { x: (F.x + H.x) / 2, y: (F.y + H.y) / 2 };
          // 2) FH斜率 => 垂线斜率 => 过M
          // 也可以直接用几何法(垂线方程)
          let dx = H.x - F.x;
          let dy = H.y - F.y;
          // 若dx=0 => FH垂直 => 垂直平分线水平
          // 若dy=0 => FH水平 => 垂直平分线垂直
          function solvePerpLineCircleIntersection(M, dx, dy, O, r) {
            // 垂线:过M,斜率 = -dx/dy(若dy!=0)
            // 参数方程:X = Mx + t*(-dy), Y = My + t*(dx)
            return function(t) {
              return {
                x: M.x + t * -dy,
                y: M.y + t * dx
              };
            };
          }
          let param = solvePerpLineCircleIntersection(M, dx, dy, O, r);
          // 再结合圆方程求交点
          function lineCircleIntersection(O, r, param) {
            // 代入: (Mx - O.x - t*dy)^2 + (My - O.y + t*dx)^2 = r^2
            // => A t^2 + B t + C=0
            let Mx_ = M.x - O.x;
            let My_ = M.y - O.y;
            // Here we do direct expansions
            // X(t)= Mx_ + t*(-dy), Y(t)= My_ + t*(dx)
            let A_ = dy * dy + dx * dx;
            let B_ = 2 * (Mx_ * -dy + My_ * dx);
            let C_ = Mx_ * Mx_ + My_ * My_ - r * r;
            let disc_ = B_ * B_ - 4 * A_ * C_;
            if (disc_ < 0) return [];
            let t1 = (-B_ + Math.sqrt(disc_)) / (2 * A_);
            let t2 = (-B_ - Math.sqrt(disc_)) / (2 * A_);
            let sol1 = param(t1);
            let sol2 = param(t2);
            return [sol1, sol2];
          }
          let IJ = lineCircleIntersection(O, r, param);
          if (IJ.length === 2) {
            I = IJ[0]; 
            J = IJ[1];
            // 画中点M
            drawPoint(M, "M", "#666");
            // 绘制FH
            drawLine(F, H, "#ef4444"); 
            // 垂直平分线
            drawLine(I, J, "#ec4899", 1.5);
            drawPoint(I, "I", "#ef4444");
            drawPoint(J, "J", "#ef4444");
          }
        }

        if (step >= 6) {
          // 步骤6:I、J为正十七边形的两个顶点
          // (这里只演示得到I、J,不继续15个点的详细分割)
          // 如果需要在动画中展示全部17个点,需等分圆
          // 这里先简化表述
        }

        if (step >= 7) {
          // 步骤7:用圆规等分出其余15个点(简化处理:仅画一些点示意)
          // 真正的等分需要 360/17 ≈ 21.176470° 间隔。这里仅示意画
          
          // 已有2个顶点 I, J。为简便,我们这里“假设”并画出全部17个顶点
          // 真实构造过程更复杂,这里重点演示原理
          const allVertices = [];
          for (let k = 0; k < 17; k++) {
            let angle = (2 * Math.PI * k) / 17;
            let vx = centerX + r * Math.cos(angle);
            let vy = centerY - r * Math.sin(angle);
            allVertices.push({ x: vx, y: vy });
          }
          // 画所有顶点
          ctx.strokeStyle = "#10b981";
          ctx.lineWidth = 2;
          ctx.beginPath();
          for (let i = 0; i < 17; i++) {
            let p = allVertices[i];
            ctx.lineTo(p.x, p.y);
          }
          ctx.closePath();
          ctx.stroke();

          // 填充一下
          ctx.fillStyle = "rgba(16,185,129,0.1)";
          ctx.fill();

          // 标记几个顶点
          for (let i = 0; i < 17; i++) {
            let p = allVertices[i];
            drawPoint(p, `A${i + 1}`, "#10b981");
          }
        }
      }

      // 更新步骤说明
      function updateStepsDisplay() {
        stepsDiv.innerHTML = "";
        for (let i = 0; i < steps.length; i++) {
          const p = document.createElement("p");
          p.className = i === currentStep ? "font-medium text-indigo-600" : "text-gray-600";
          p.innerHTML = (i + 1) + ". " + steps[i];
          stepsDiv.appendChild(p);
        }
        currentStepSpan.textContent = currentStep + 1;
        const progress = (currentStep / (totalSteps - 1)) * 100;
        progressBar.style.width = progress + "%";

        prevBtn.disabled = currentStep === 0;
        nextBtn.disabled = currentStep === totalSteps - 1;
      }

      function play() {
        if (playInterval) return;
        playInterval = setInterval(() => {
          if (currentStep < totalSteps - 1) {
            currentStep++;
            drawStep(currentStep);
            updateStepsDisplay();
          } else {
            pause();
          }
        }, playSpeed);
      }

      function pause() {
        if (playInterval) {
          clearInterval(playInterval);
          playInterval = null;
        }
      }

      function reset() {
        pause();
        currentStep = 0;
        drawStep(currentStep);
        updateStepsDisplay();
      }

      function prev() {
        if (currentStep > 0) {
          currentStep--;
          drawStep(currentStep);
          updateStepsDisplay();
        }
      }

      function next() {
        if (currentStep < totalSteps - 1) {
          currentStep++;
          drawStep(currentStep);
          updateStepsDisplay();
        }
      }

      // 按钮事件
      prevBtn.addEventListener("click", prev);
      nextBtn.addEventListener("click", next);
      playBtn.addEventListener("click", play);
      pauseBtn.addEventListener("click", pause);
      resetBtn.addEventListener("click", reset);

      // 初始化
      drawStep(currentStep);
      updateStepsDisplay();
    });
  </script>
</body>
</html>

8. 历史意义与扩展

高斯的这一发现具有深远的数学意义:

  1. 理论突破:解决了存在两千多年的几何问题。

  2. 方法创新:开创了用代数方法解决几何问题的先河,为后来的伽罗瓦理论奠定基础。

  3. 更广泛的结论:证明了哪些正多边形可以用尺规作图,哪些不能。例如:

    • 正257边形(257 = F 3 F_3 F3)和正65537边形(65537 = F 4 F_4 F4)也可以用尺规作图
    • 正7边形、正9边形、正11边形等则无法用尺规精确作图

9. 结语:数学美的完美呈现

正十七边形的尺规作图证明体现了数学之美的多个层面:

  • 逻辑的美:从抽象的代数方程到具体的几何构造,每一步都严密且优雅。
  • 统一的美:代数与几何这两个看似分离的数学分支在此问题中完美融合。
  • 历史的美:一个存在两千多年的古老问题,最终被一位19岁的青年解决。
  • 视觉的美:最终构造出的正十七边形,具有令人赏心悦目的对称性。

正如高斯自己所说:"数学是科学的皇后,而数论是数学的皇后。"正十七边形的尺规作图证明,正是这一理念的完美体现。


本文附带的交互式网页是理解正十七边形尺规作图过程的理想工具,建议读者亲自体验,以加深对这一数学杰作的理解。

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

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

相关文章

常见Web应用源码泄露问题

文章目录 前言一、常见的源码泄露漏洞git源码泄露SVN源码泄露DS_Store文件泄漏网站备份压缩文件泄露WEB-INF/web.xml泄露CVS泄露.hg源码泄露Bazaar/bzr泄露.swp文件泄露 前言 在Web应用方面对于安全来说&#xff0c;可能大家对SQL注入、XSS跨站脚本攻击、文件上传等一些漏洞已…

使用Modelsim手动仿真

FPGA设计流程 在设计输入之后,设计综合前进行 RTL 级仿真,称为综合前仿真,也称为前仿真或 功能仿真。前仿真也就是纯粹的功能仿真,主旨在于验证电路的功能是否符合设计要求,其特点是不考虑电路门延迟与线延迟。在完成一个设计的代码编写工作之后,可以直接对代码进行仿真,…

利用 ArcGIS Pro 快速统计省域各市道路长度的实操指南

在地理信息分析与处理的工作中&#xff0c;ArcGIS Pro 是一款功能强大的 GIS 软件&#xff0c;它能够帮助我们高效地完成各种复杂的空间数据分析任务。 现在&#xff0c;就让我们一起深入学习如何借助 ArcGIS Pro 来统计省下面各市的道路长度&#xff0c;这一技能在城市规划、…

1.4 单元测试与热部署

本次实战实现Spring Boot的单元测试与热部署功能。单元测试方面&#xff0c;通过JUnit和Mockito等工具&#xff0c;结合SpringBootTest注解&#xff0c;可以模拟真实环境对应用组件进行独立测试&#xff0c;验证逻辑正确性&#xff0c;提升代码质量。具体演示了HelloWorld01和H…

掌握Kubernetes Network Policy,构建安全的容器网络

在 Kubernetes 集群中&#xff0c;默认情况下&#xff0c;所有 Pod 之间都是可以相互通信的&#xff0c;这在某些场景下可能会带来安全隐患。为了实现更精细的网络访问控制&#xff0c;Kubernetes 提供了 Network Policy 机制。Network Policy 允许我们定义一组规则&#xff0c…

结合rpart包的决策树介绍

决策树与CART算法 决策树是一种基于树状结构的监督学习算法。它通过从根节点开始递归地对特征进行划分&#xff0c;构建出一棵树来进行决策。决策树的构建过程需要解决的重要问题有三个&#xff1a;如何选择自变量、如何选择分割点、确定停止划分的条件。解决这些问题是希望随…

VScode代码格式化插件black失效问题

之前有如下提示&#xff1a; 没太当回事&#xff0c;发现还能用。之后突然就用不了了&#xff0c;跟着官方插件的文档来查看log&#xff1a; 查看发现提示&#xff1a; Message: TypeError: type object is not subscriptable 在github界面找到解决方案&#xff1a;安装Versio…

【经验分享】Ubuntu20.04编译RK3568 AI模型报错问题(已解决)

【经验分享】Ubuntu20.04编译RK3568 AI模型报错问题&#xff08;已解决&#xff09; 前言问题现象问题分析解决方案总结 前言 这里使用的是Rockchip提供的rknn_model_zoo&#xff0c;https://github.com/airockchip/rknn_model_zoo/tree/main 此解决方案适用于Rockchip芯片在U…

AI革命先锋:DeepSeek与蓝耘通义万相2.1的无缝融合引领行业智能化变革

云边有个稻草人-CSDN博客 目录 引言 一、什么是DeepSeek&#xff1f; 1.1 DeepSeek平台概述 1.2 DeepSeek的核心功能与技术 二、蓝耘通义万相2.1概述 2.1 蓝耘科技简介 2.2 蓝耘通义万相2.1的功能与优势 1. 全链条智能化解决方案 2. 强大的数据处理能力 3. 高效的模型…

基于SpringBoot实现旅游酒店平台功能一

一、前言介绍&#xff1a; 1.1 项目摘要 随着社会的快速发展和人民生活水平的不断提高&#xff0c;旅游已经成为人们休闲娱乐的重要方式之一。人们越来越注重生活的品质和精神文化的追求&#xff0c;旅游需求呈现出爆发式增长。这种增长不仅体现在旅游人数的增加上&#xff0…

轻松上手 —— 通过 RPM 包快速部署 NebulaGraph

前言 在当今大数据时代&#xff0c;处理复杂关系数据的需求与日俱增&#xff0c;图数据库应运而生并逐渐崭露头角。NebulaGraph 作为一款高性能、分布式且易扩展的图数据库&#xff0c;专为应对大规模图数据处理而精心打造。它不仅具备丰富的查询语言&#xff0c;还拥有强大高效…

MetaGPT发布的MGX与Devin深度对比

家人们&#xff0c;搞编程的都知道&#xff0c;工具选对了&#xff0c;效率能翻倍&#xff01;今天必须给大伙唠唠MetaGPT发布的MGX编程助手和Devin编程助手 。 先看MGX&#xff0c;简直是编程界的王炸&#xff01;它就像一个超神的虚拟开发团队&#xff0c;一堆智能助手分工明…

03.06 QT

一、使用QSlider设计一个进度条&#xff0c;并让其通过线程自己动起来 程序代码&#xff1a; <1> Widget.h: #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QThread> #include "mythread.h"QT_BEGIN_NAMESPACE namespace Ui {…

SpringUI:打造高质量Web交互设计的首选元件库

SpringUI作为一个专为Web设计与开发领域打造的高质量交互元件库&#xff0c;确实为设计师和开发者提供了极大的便利。以下是对SpringUI及其提供的各类元件的详细解读和一些建议&#xff1a; SpringUI概述 SpringUI集合了一系列预制的、高质量的交互组件&#xff0c;旨在帮助设…

鸿蒙Android4个脚有脚线

效果 min:number122max:number150Row(){Stack(){// 底Text().border({width:2,color:$r(app.color.yellow)}).height(this.max).aspectRatio(1)// 长Text().backgroundColor($r(app.color.white)).height(this.max).width(this.min)// 宽Text().backgroundColor($r(app.color.w…

夏门大学DeepSeek 手册:从社会大众到高校及企业的全面应用实践研究(附 PDF 下载)

这 3 份手册分别从 DeepSeek 大模型概念、技术与应用实践、DeepSeek 大模型赋能高校教学和科研、DeepSeek 大模型及其企业应用实践-企业人员的大模型宝典几个角度进行全面分析&#xff0c;可以结合着清华、北大系列相互对照着学习。 清华北大推出的 DeepSeek 教程&#xff08;…

策略模式详解:实现灵活多样的支付方式

多支付方式的实现&#xff1a;策略模式详解 策略模式&#xff08;Strategy Pattern&#xff09;是一种行为设计模式&#xff0c;它定义了一系列算法&#xff0c;并将每个算法封装起来&#xff0c;使它们可以互换使用。策略模式使得算法可以独立于使用它的客户端变化。本文将通…

【Java篇】算术如诗,逻辑似梦:Java 编程中的运算符探寻

文章目录 Java 运算符&#xff1a;在计算与逻辑之中追寻编程的哲理1.前言2. 算术运算符2.1 基本四则运算符&#xff1a;加减乘除&#xff08; - * / %&#xff09;2.2 除法与取余2.3 增量运算符&#xff08; --&#xff09;2.4 自增/自减运算符 3. 关系运算符3.1 关系运算符 4.…

【大模型系列篇】国产开源大模型DeepSeek-V3技术报告解析

DeepSeek-V3技术报告 目录 DeepSeek-V3技术报告 1. 摘要 2. 引言 3. DeepSeek V3 架构 3.1 基础架构 3.1.1. 多头潜在注意力 3.1.2. DeepSeekMoE和无辅助损失的负载均衡 3.2 多令牌预测 4. 基础设施 4.1 计算集群 4.2 训练框架 4.2.1. DualPipe算法与计算通信协同优…

双足机器狗开发:Rider - Pi

双足机器狗开发:Rider - Pi https://github.com/YahboomTechnology/Rider-Pi-Robot 项目介绍 Rider - Pi是一款为开发者、教育工作者和机器人爱好者设计的桌面双轮腿式机器人,它基于树莓派CM4核心模块构建,具备多种先进功能和特点: 硬件特性 核心模块:采用树莓派CM4核…