Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.10.2012, 11:29   #1
Lidiya585
Пользователь
 
Регистрация: 05.11.2011
Сообщений: 29
По умолчанию Возведение матрицы в степень за O(log n) C++

Задали написать программу возведения матрицы в степень за O(log n).
Не могу понять, как реализовать возведение в степень для матрицы (для числа за O(log n) знаю).
На то, что находила в интернете, преподаватель говорит, что не так. Хотя сам, кажется, не совсем понимает, как это делать.
Вот пример кода, который я написала по примеру преподавателя, но там, где реализуется возведение в степень - не правильно.
Как правильно реализовать эту задачу?
Код:
#include "stdafx.h"
#include <iostream>
void matrix(int m1[2][2], int m2[2][2], int r[2][2])
{
 for (int i=0;i<2;++i)
           for (int j=0;j<2;++j)
                {
                 int s=0;
                    for (int l=0;l<2;++l)
                         {
                          s+=m1[i][l]*m2[l][j];
                          }
                          r[i][j]=s;
                      
                 }
    
}

int main()
{
int m1[2][2], m2[2][2], r[2][2], n=2, k;
    m1[0][0]=1;
    m1[0][1]=1;
    m1[1][0]=1;
    m1[1][1]=0;
    m2[0][0]=1;
    m2[0][1]=1;
    m2[1][0]=1;
    m2[1][1]=0;
   
    k=n; 
    r[2][2]= m1[2][2];
    
    while (k!=0)
           {
            if (k%2==0)
                {
                 k=k/2;
                 matrix(m1,m2,r);
                 m1[2][2]=r[2][2];
                }
            else
                {
                 k=k-1;
                 matrix(m1,m2,r);
                }
           }
        
std::cout<< r[0][0]<<".";
std::cout<< r[0][1]<<".";
std::cout<< r[1][0]<<".";
std::cout<< r[1][1]<<"."; 
}
Lidiya585 вне форума Ответить с цитированием
Старый 31.10.2012, 11:41   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Ой. Бэрримор, что это? Надо - так:
Код:
unsigned degree;
matrix m, acc;
//Инициализация; acc инициализируется единичной матрицей
for(; degree != 0; degree >>= 1){
    if(degree%2 != 0) MultiplyMatrixBy(acc, m);
    MultiplyMatrixBy(m, m);
}
Вот здесь этот приём был пущен в ход - обратите внимание на реализацию SquareMatrix:perator*=. Ваша функция matrix вообще не работает - она принимает третий аргумент по значению, что означает, что она работает с его копией, а не с переданным оригиналом.
Abstraction вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
возведение в степень [CODER] Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 6 14.04.2014 10:18
Возведение квадратной матрицы в степень xxlolxx Microsoft Office Excel 1 21.12.2011 21:17
VBA Возведение матрицы в степень AMaxim Помощь студентам 0 19.12.2011 23:12
Возведение матрицы в степень Jumbo Помощь студентам 0 21.04.2011 16:02
возведение матрицы в степень Kanzann Паскаль, Turbo Pascal, PascalABC.NET 0 27.04.2010 19:08