c語言矩陣快速冪,快速冪演算法c語言代碼

本文目錄一覽:

矩陣的冪怎麼算?

有下面三種情況:

1、如果你所要求的是一般矩陣的高次冪的話,是沒有捷徑可走的,只能夠一個個去乘出來。

至於低次冪,如果能夠相似對角化,即:存在簡便演算法的話,在二階矩陣的情況下簡便演算法未必有直接乘來得快,所以推薦直接乘。

2、如果你要求的是能夠相似對角化的矩陣的高次冪的話,是存在簡便演算法的。

設要求矩陣A的n次冪,且A=Q^(-1)*Λ*Q,其中Q為可逆陣,Λ為對角陣。

即:A可以相似對角化。那麼此時,有求冪公式:A^n=Q^(-1)*(Λ)^n*Q,而對角陣求n次方,只需要每個對角元素變為n次方即可,這樣就可以快速求出二階矩陣A的的高次冪。

3、如果矩陣可以相似對角化,求相似對角化的矩陣Q的具體步驟為:

求|λE-A|=0 (其中E為單位陣)的解,得λ1和λ2(不管是否重根),這就是Λ矩陣的對角元素。

依次把λ1和λ2帶入方程(如果λ是重根只需代一次,就可求得兩個基礎解)[λE-A][x]=[0],求得兩個解向量[x1]、[x2],從而矩陣Q的形式就是[x1 x2]。

接下來的求逆運算是一種基礎運算,這裡不再贅述。

下面可以舉一個例子:

二階方陣:

1 a

0 1

求它的n次方矩陣

方陣A的k次冪定義為 k 個A連乘: A^k = AA…A (k個)

一些常用的性質有:

1. (A^m)^n = A^mn

2. A^mA^n = A^(m+n)

一般計算的方法有:

1. 計算A^2,A^3 找規律, 然後用歸納法證明

2. 若r(A)=1, 則A=αβ^T, A^n=(β^Tα)^(n-1)A

注: β^Tα =α^Tβ = tr(αβ^T)

3. 分拆法: A=B+C, BC=CB, 用二項式公式展開

適用於 B^n 易計算, C的低次冪為零矩陣: C^2 或 C^3 = 0.

4. 用對角化 A=P^-1diagP

A^n = P^-1diag^nP

擴展資料:

冪等矩陣的主要性質:

1.冪等矩陣的特徵值只可能是0,1;

2.冪等矩陣可對角化;

3.冪等矩陣的跡等於冪等矩陣的秩,即tr(A)=rank(A);

4.可逆的冪等矩陣為E;

5.方陣零矩陣和單位矩陣都是冪等矩陣;

6.冪等矩陣A滿足:A(E-A)=(E-A)A=0;

7.冪等矩陣A:Ax=x的充要條件是x∈R(A);

8.A的核N(A)等於(E-A)的列空間R(E-A),且N(E-A)=R(A)。考慮冪等矩陣運算後仍為冪等矩陣的要求,可以給出冪等矩陣的運算:

1)設 A1,A2都是冪等矩陣,則(A1+A2) 為冪等矩陣的充分必要條件為:A1·A2 =A2·A1=0,且有:R(A1+A2) =R (A1) ⊕R (A2);N(A1+A2) =N(A1)∩N(A2);

2)設 A1, A2都是冪等矩陣,則(A1-A2) 為冪等矩陣的充分必要條件為:A1·A2=A2·A1=A2,且有:R(A1-A2) =R(A1)∩N (A2);N (A1- A2) =N (A1)⊕R (A2);

3)設 A1,A2都是冪等矩陣,若A1·A2=A2·A1,則A1·A2為冪等矩陣,且有:R (A1·A2) =R(A1) ∩R (A2);N (A1·A2) =N (A1) +N (A2)。

如何用c語言中的函數遞歸調用演算法實現n階矩陣的n次冪的求解?

/*用c語言中的函數遞歸調用演算法實現n階矩陣的n次冪*/

#include stdio.h

#include stdlib.h

#include time.h

#include string.h

//創建矩陣,矩陣用一維數組存儲

double *matCreate(unsigned int m, unsigned int n)

{

double *p = (double *)malloc(sizeof(double) * m * n);

if (p == NULL) printf(“創建矩陣失敗!\n”);

return p;

}

//輸入矩陣元素

void matInput(double *a, unsigned int m, unsigned int n)

{

for (int i = 0; i m; ++i)

{

for (int j = 0; j n; ++j)

{

scanf(“%f “, a[i * n + j]);

}

}

return;

}

//隨機產生矩陣元素,均勻分布於[from to]

void matInitRand(double *a, unsigned int m, unsigned int n, double from, double to)

{

if (a == NULL || m = 0 || n = 0) return;

double x;

srand(time(NULL));

for (int i = 0; i m; ++i)

{

for (int j = 0; j n; ++j)

{

x = (1.0 * rand() / RAND_MAX) * (to – from) + from;

a[i * n + j] = x;

}

}

return;

}

//轉置

void matTranspose(double *a, double *b, unsigned int m, unsigned int n)

{

for (int i = 0; i m; ++i)

{

for (int j = 0; j n; ++j)

{

b[j*n +i]=a[i * n + j] ;

}

}

}

//輸出矩陣

void matPrint(double *a, unsigned int m, unsigned int n)

{

for (int i = 0; i m; ++i)

{

for (int j = 0; j n; ++j)

{

printf(“%8.4f “, a[i * n + j]);

}

putchar(‘\n’);

}

return;

}

//矩陣乘法c=a*b

void matMul(double *a, double *b, double *c, unsigned int m, unsigned int n, unsigned int k)

{

if (a == NULL || b == NULL || c == NULL || m = 0 || n = 0 || k = 0) return;

double x = 0.0f;

for (int i = 0; i m; ++i)

{

for (int u = 0; u k; ++u)

{

x = 0.0f;

for (int j = 0; j n; ++j)

{

x += a[i * n + j] * b[j * k + u];

}

c[i * k + u] = x;

}

}

return;

}

//b=a^n, a:m*m階矩陣

void matFac(double *a, double *b, unsigned int n, unsigned int m)

{

double *c = (double *)malloc(sizeof(double) * m * m); //保存臨時結果

if (n 1)

{

matFac(a, c, n – 1, m);

matMul(a, c, b, m, m, m);

}

else

memcpy(b, a, sizeof(double)*m * m);

// printf(“%d:\n”,n);

// matPrint(b, m,m);

free(c); //回收內存

return ;

}

#define M 3

#define N 4

#define K N

int main(int argc, char const *argv[])

{

double *A, *B, *B1,*BT, *C;

A = matCreate(M, N);

B = matCreate(N, K);

B1 = matCreate(N, K);

BT = matCreate(K,N);

C = matCreate(M, K);

if (!A || !B || !B1 || !BT || !C) return -1;

matInitRand(A, M, N, 0.0f, 1.0f);

printf(“A=\n”);

matPrint(A, M, N);

matInitRand(B, N, K, 0.0f, 1.0f);

printf(“B=\n”);

matPrint(B, N, K);

matTranspose(B,BT,N,K);

printf(“B’=\n”);

matPrint(BT, K,N);

matMul(A, B, C, M, N, K);

printf(“C=A*B\n”);

matPrint(C, M, N);

matFac(B, B1, 4, N);

printf(“B^4\n”);

matPrint(B1, N, K);

return 0;

}

c語言,快速冪代碼是什麼,怎麼用?

所謂的快速冪,實際上是快速冪取模的縮寫,簡單的說,就是快速的求一個冪式的模(余)。在程序設計過程中,經常要去求一些大數對於某個數的餘數,為了得到更快、計算範圍更大的演算法,產生了快速冪取模演算法。

用遞歸

x^y可如下實現

unsigned long pow(int x, unsigned y)

{

unsigned long tmp;

if(!y) return 1;

tmp = pow(x, y / 2);

if(y % 2 == 0) return (tmp * tmp);

else return (tmp * tmp * x);

}

用C/C++如何實現矩陣的冪運算,求高手作答~

#includestdio.h

#includestring.h

#includestdlib.h

#includetime.h

int ** alloc2d(int m) {

int **array,i;

array=(int **)malloc(m*sizeof(int *));

if(array==NULL) return NULL;

for(i=0;im;i++) {

array[i]=(int *)malloc(m*sizeof(int));

if(array[i]==NULL) {for(;i=0;i–) {free(array[i]);} free(array);return NULL;}

}

return array;

}

void autoinput(int **a,int m) {

int i,j;

srand(time(0));

for(i=0;im;i++)

for(j=0;jm;j++)

*(*(a+i)+j)=rand()%3;

}

void out(int **a,int m) {

int i,j;

for(i=0;im;i++) {

for(j=0;jm;j++)

printf(“%4d”,*(*(a+i)+j));

printf(“\n”);

}

}

int **mltply(int **a,int **b,int **c,int m) {

int i,j,k;

for(i=0;im;i++)

for(j=0;jm;j++)

for(*(*(c+i)+j)=0,k=0;km;k++)

*(*(c+i)+j)+=*(*(a+i)+k)*(*(*(b+k)+j));

return c;

}

int main() {

int i,m,times,j,n=0;

int **ops[3];

printf(“input乘法方陣規模m*m幾次冪:\n”);

scanf(“%d%d”,m,times);

for(i=0;i3;i++) {

ops[i]=alloc2d(m);

if(i=0) {autoinput(ops[i],m);printf(“矩陣%d\n”,i+1);out(ops[i],m);printf(“\n”);}

}

for(int h=1;h=2;h++)

for(i=0;im;i++)

for(j=0;jm;j++)

*(*(ops[h]+i)+j)=0;

printf(“\n乘法\n”);

mltply(ops[0],ops[0],ops[1],m);

times-=2;

while(times) {

if(n++%2==0) mltply(ops[1],ops[0],ops[2],m);

else mltply(ops[2],ops[0],ops[1],m);

–times;

}

if(n%2==0) out(ops[1],m);

else out(ops[2],m);

return 0;

}

//矩陣輸入用的隨機

//可能麻煩了點 要不你優化一下

用C語言編寫程序求矩陣的n次方

這要看具體情況 一般有以下幾種方法 1. 計算A^2,A^3 找規律, 然後用歸納法證明 2. 若r(A)=1, 則A=αβ^T, A^n=(β^Tα)^(n-1)A 注: β^Tα =α^Tβ = tr(αβ^T) 3. 分拆法: A=B+C, BC=CB, 用二項式公式展開 適用於 B^n 易計算, C的低次冪為零: C^2 或 C^3.

C語言有關快速冪的問題

type

arrty=array[1..10000] of longint;

var

n,mn,len,lenm,i,mnl:longint;

a,m:arrty;

procedure mxm;

var

c:arrty;

i,j:longint;

begin

fillchar(c,sizeof(c),0);

for i:=1 to lenm do

for j:=1 to lenm do

begin

inc(c[i+j-1],m[i]*m[j]);

inc(c[i+j],c[i+j-1] div 10);

c[i+j-1]:=c[i+j-1] mod 10;

end;

lenm:=lenm+lenm+1;

while (lenm1) and (c[lenm]=0) do

dec(lenm);

for i:=1 to lenm do

m[i]:=c[i];

end;

procedure axm;

var

c:arrty;

i,j:longint;

begin

fillchar(c,sizeof(c),0);

for i:=1 to len do

for j:=1 to lenm do

begin

inc(c[i+j-1],a[i]*m[j]);

inc(c[i+j],c[i+j-1] div 10);

c[i+j-1]:=c[i+j-1] mod 10;

end;

len:=len+lenm+1;

while (len1) and (c[len]=0) do

dec(len);

for i:=1 to len do

a[i]:=c[i];

end;

begin

fillchar(a,sizeof(a),0);

readln(mn,n);

mnl:=mn;

len:=0;

while mnl0 do

begin

inc(lenm);

m[lenm]:=mnl mod 10;

mnl:=mnl div 10;

end;

a[1]:=1;

len:=1;

while n0 do

begin

if n mod 2=1 then

axm;

n:=n div 2;

mxm;

end;

for i:=len downto 1 do

write(a[i]);

writeln;

end.

原創文章,作者:PTGX,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/147642.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
PTGX的頭像PTGX
上一篇 2024-11-02 13:11
下一篇 2024-11-02 13:11

相關推薦

  • 蝴蝶優化演算法Python版

    蝴蝶優化演算法是一種基於仿生學的優化演算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化演算法Python版…

    編程 2025-04-29
  • Ojlat:一款快速開發Web應用程序的框架

    Ojlat是一款用於快速開發Web應用程序的框架。它的主要特點是高效、易用、可擴展且功能齊全。通過Ojlat,開發人員可以輕鬆地構建出高質量的Web應用程序。本文將從多個方面對Oj…

    編程 2025-04-29
  • Python實現爬樓梯演算法

    本文介紹使用Python實現爬樓梯演算法,該演算法用於計算一個人爬n級樓梯有多少種不同的方法。 有一樓梯,小明可以一次走一步、兩步或三步。請問小明爬上第 n 級樓梯有多少種不同的爬樓梯…

    編程 2025-04-29
  • AES加密解密演算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密演算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES演算法,並對實現過程進…

    編程 2025-04-29
  • Python將矩陣存為CSV文件

    CSV文件是一種通用的文件格式,在統計學和計算機科學中非常常見,一些數據分析工具如Microsoft Excel,Google Sheets等都支持讀取CSV文件。Python內置…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演著非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • Harris角點檢測演算法原理與實現

    本文將從多個方面對Harris角點檢測演算法進行詳細的闡述,包括演算法原理、實現步驟、代碼實現等。 一、Harris角點檢測演算法原理 Harris角點檢測演算法是一種經典的計算機視覺演算法…

    編程 2025-04-29
  • 數據結構與演算法基礎青島大學PPT解析

    本文將從多個方面對數據結構與演算法基礎青島大學PPT進行詳細的闡述,包括數據類型、集合類型、排序演算法、字元串匹配和動態規劃等內容。通過對這些內容的解析,讀者可以更好地了解數據結構與算…

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • 瘦臉演算法 Python 原理與實現

    本文將從多個方面詳細闡述瘦臉演算法 Python 實現的原理和方法,包括該演算法的意義、流程、代碼實現、優化等內容。 一、演算法意義 隨著科技的發展,瘦臉演算法已經成為了人們修圖中不可缺少…

    編程 2025-04-29

發表回復

登錄後才能評論