位与运算符、矩阵快速幂

news/2024/10/22 18:31:07/

&运算符的作用是,比较两个数的二进制位,均1取1,否则该位为0。常用于:

  • 判断某个非负整数的二进制最后一位是否为1:

    int x = 4;
    if (x & 1 == 1) {printf("最后一位为1\n");
    }
    
  • 和移位运算符>>结合,统计一个非负整数的二进制中1的个数:

    int x = 4;
    int count = 0;
    while (x)  {  // 直到x=0if (x & 1 == 1) {count += 1;}x >>= 1;  // 右移1位,相当于除以2
    }
    printf("共 %d 个1\n", count);
    

矩阵快速幂思想

矩阵的快速幂是用来高效地计算矩阵的高次方的。将朴素的o(n)的时间复杂度,降到log(n)。

这里先对原理(主要运用了矩阵乘法的结合律)做下简单形象的介绍:

一般一个矩阵的n次方,我们会通过连乘n-1次来得到它的n次幂。

但做下简单的改进就能减少连乘的次数,方法如下:

把n个矩阵进行两两分组,比如:AAAAAA => (AA)(AA)(AA)

这样变的好处是,你只需要计算一次AA,然后将结果(AA)连乘自己两次就能得到A6,即(A*A)3=A^6。算一下发现这次一共乘了3次,少于原来的5次。

其实大家还可以取A^3作为一个基本单位。原理都一样:利用矩阵乘法的结合律,来减少重复计算的次数。

以上都是取一个具体的数来作为最小单位的长度,这样做虽然能够改进效率,但缺陷也是很明显的,取个极限的例子(可能有点不恰当,但基本能说明问题),当n无穷大的时候,你现在所取的长度其实和1没什么区别。所以就需要我们找到一种与n增长速度”相适应“的”单位长度“,那这个长度到底怎么去取呢???这点是我们要思考的问题。

有了以上的知识,我们现在再来看看,到底怎么迅速地求得矩阵的N次幂。

既然要减少重复计算,那么就要充分利用现有的计算结果咯!~怎么充分利用计算结果呢???这里考虑二分的思想。。

大家首先要认识到这一点:任何一个整数N,都能用二进制来表示。。这点大家都应该知道,但其中的内涵真的很深很深(这点笔者感触很深,在文章的最后,我将谈谈我对的感想)!!

计算机处理的是离散的信息,都是以0,1来作为信号的处理的。可想而知二进制在计算机上起着举足轻重的地位。它能将模拟信号转化成数字信号,将原来连续的实际模型,用一个离散的算法模型来解决。 好了,扯得有点多了,不过相信这写对下面的讲解还是有用的。

回头看看矩阵的快速幂问题,我们是不是也能把它离散化呢?比如 A 19 = > ( A 16 ) ∗ ( A 2 ) ∗ ( A 1 ) A^{19} => (A^{16})*(A^2)*(A^1) A19=>A16A2A1,显然采取这样的方式计算时因子数将是log(n)级别的(原来的因子数是n),不仅这样,因子间也是存在某种联系的,比如 A 4 A^4 A4能通过 ( A 2 ) ∗ ( A 2 ) (A^2)*(A^2) (A2)(A2)得到, A 8 A^8 A8又能通过 ( A 4 ) ∗ ( A 4 ) (A^4)*(A^4) (A4)(A4)得到,这点也充分利用了现有的结果作为有利条件。下面举个例子进行说明:

现在要求 A 1 56 A^156 A156,而156(10)=10011100(2)

也就有 A 1 56 A^156 A156=> ( A 4 ) (A^4) (A4) ( A 8 ) (A^8) (A8) ( A 16 ) (A^{16}) (A16)* ( A 128 (A^{128} (A128) 考虑到因子间的联系,我们从二进制10011100中的最右端开始计算到最左端。细节就说到这,下面给核心代码:

while(N)
{if(N & 1)  // 位与res = res*A;n >>= 1;  // 移位并赋值A = A*A;
}

http://www.ppmy.cn/news/79049.html

相关文章

Emacs之实时渲染markdown(九十五)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

Three.js--》实现3d小岛模型搭建

目录 项目搭建 初始化three.js基础代码 设置环境背景 设置水面样式 添加天空小岛 今天简单实现一个three.js的小Demo,加强自己对three知识的掌握与学习,只有在项目中才能灵活将所学知识运用起来,话不多说直接开始。 项目搭建 本案例还…

NFT游戏Mythical Beings将参加NFT Polygon 在线展会

Mythical Beings神秘生物是由Tarasca Art & Games 开发的基于区块链的卡牌收集游戏。游戏中每张卡牌所拥有的属性和背后的故事都是独一无二的,Mythical Beings不仅具有游戏属性,还兼具故事的传承。 作为一款跨链Polygon的NFT游戏,Mythic…

多态的应用

多态的应用 1.多态的构建: ​ 自我理解:就是 父类引用指向子类对象。 功能 : 父类能调用父类对应子类的方法和属性,但是都是优先调用 重写的方法 或 子类的属性! 创建子类构造器,就是先进入子类构造器&…

花指令问题

前言 想起之前打题的时候经常会遇到一些关乎花指令的问题,但是没有系统地总结归纳花指令去除的姿势,浅浅开一个坑慢慢来写 题1:简单jmp 可以骗过dbg,但是放在ida中就很容易看出来,无效跳转 题目来源:[HD…

【Android笔记103】Android之自动完成文本框组件(AutoCompleteTextView、MultiAutoCompleteTextView)

这篇文章,主要介绍Android之自动完成文本框组件(AutoCompleteTextView、MultiAutoCompleteTextView)。 目录 一、AutoCompleteTextView组件 1.1、运行效果 1.2、案例代码 (1)布局文件

【C++刷题集】-- day3

目录 选择题 单选 OR59 字符串中找出连续最长的数字串⭐ 【题目解析】 【解题思路】 JZ39 数组中出现次数超过一半的数字⭐ 【题目解析】 【解题思路1】 【解题思路2】 选择题 单选 1、以下程序的输出结果是 ( ) #include <stdio.h> int main() {char a[10] …

CodeForces.1786A2.发牌.[中等][flg标识][数学规律][双色牌]

题目描述&#xff1a; 题目解读&#xff1a; 发牌问题&#xff0c;给两人发双色牌&#xff0c;同样还是 给a发1张&#xff0c;然后给b发2&#xff0c;3张&#xff1b; 给a发4&#xff0c;5张&#xff0c;给b发6&#xff0c;7张&#xff1b; 给a发8&#xff0c;9张&#xff…