Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Wyznaczanie modulo z ciągu fibonacciego

Ostatnio zmodyfikowano 2017-11-07 19:00
Autor Wiadomość
jankowalski25
» 2017-11-02 18:16:28
C/C++
if( wynik > m ) wynik -= m; // zamiast modulo

mateczek: Większe lub równe. Widzę, że garlonicon też popełnił ten błąd. Przecież
m % m == 0
.
P-166364
jatoprzechuj
Temat założony przez niniejszego użytkownika
» 2017-11-03 17:06:09
Użyłem własnych macierzy, ale nie wiem jak przekonwertować je na inta.
C/C++
#include <iostream>
using namespace std;

struct Matrix_2x2 {
    int a, b, c, d;
   
    Matrix_2x2() { }
    Matrix_2x2( int a1, int b1, int c1, int d1 ) {
        a = a1;
        b = b1;
        c = c1;
        d = d1;
    }
};

Matrix_2x2 operator *( Matrix_2x2 A, Matrix_2x2 B ) {
    return Matrix_2x2(
    A.a * B.a + A.b * B.c, A.a * B.b + A.b * B.d,
    A.c * B.a + A.d * B.c, A.c * B.b + A.d * B.d
    );
}

ostream & operator <<( ostream & out, Matrix_2x2 mat ) {
    return out <<
    mat.a << ' ' << mat.b << '\n' <<
    mat.c << ' ' << mat.d << '\n';
}

int power_modulo_fast( int a, int b, int m )
{
    int i;
    int result = 1;
    long int x = a % m;
   
    for( i = 1; i <= b; i <<= 1 )
    {
        x %= m;
        if(( b & i ) != 0 )
        {
            result *= x;
            result %= m;
        }
        x *= x;
    }
   
    return result;
}


int main() {
    Matrix_2x2 m = Matrix_2x2( 1, 1,
    1, 0 );
    int t, a, n;
    int wynik;
    Matrix_2x2 mac = m;
    cin >> t;
    while( t-- )
    {
        cin >> a >> n;
        if(( a == 1 ) ||( a == 2 ) ) cout << 1 % n;
        else
        {
            int wynik = power_modulo_fast( m, a, n );
            cout << wynik;
        }
    }
   
   
    return 0;
}
P-166424
mateczek
» 2017-11-03 19:07:58
ale nie wiem jak przekonwertować je na inta

a co chcesz zrobić z tymi macierzami?? (do czego chcesz je użyć??). jak chcesz je "przekonwertować" na inta?? (to są dwie różne rzeczy macierz i int) :P bez kitu ale nie widzę w tym żadnego sensu
P-166428
jatoprzechuj
Temat założony przez niniejszego użytkownika
» 2017-11-03 19:23:22
Mam zamiar obliczyć entą liczbę w ciągu fibonacciego za pomocą szykiego potęgowania modularnego macierzy i obliczyc  modulo tej liczby. Funkcja szybkiego potęgowania działa na intach przez co nie mogę przekazać do niej zmiennej Matrix_2x2  o nazwie m.
P-166430
mateczek
» 2017-11-03 19:42:02
skoro to ma być funkcja szybkiego potęgowania macierzy to musisz znaleźć, lub napisać funkcję która działa na macierzach. (ta działająca na intach się nie nada)
P-166431
jatoprzechuj
Temat założony przez niniejszego użytkownika
» 2017-11-03 19:56:55
Wymyśliłem coś takiego. To narazie wersja bez modulo, bo nie wiem czy wcisnąć je gdzieś w tą funkcje czy dopiero na końcu przy wypisywaniu.
C/C++
template < typename M >
M pot_szybkie( M a, unsigned int n )
{
    if( n % 2 == 1 ) return a * pot_szybkie( a, n - 1 );
    else return( pot_szybkie( a, n / 2 ) * pot_szybkie( a, n / 2 ) );
   
}
P-166432
mateczek
» 2017-11-03 20:30:15
zdecydowanie wcisnąć. nie policzysz liczby większej niż fib(94) na standardowych typach danych w unsigned long long zmieści się max fib(94)
P-166434
jatoprzechuj
Temat założony przez niniejszego użytkownika
» 2017-11-03 21:35:32
Znalazłem w internecie własność dla potęgowania modualrnych: A^B mod C = ( (A mod C)^B ) mod C. Lecz w tym kodzie coś nie gra...
C/C++
template < typename M >
M pot_szybkie( M a, unsigned int n )
{
    if( n % 2 == 1 ) return a * pot_szybkie( a, n - 1 );
    else return( pot_szybkie( a, n / 2 ) * pot_szybkie( a, n / 2 ) );
   
}


int main() {
    Matrix_2x2 m = Matrix_2x2( 1, 1,
    1, 0 );
    int t, a, mod;
    int wynik;
    cin >> t;
    while( t-- )
    {
        cin >> a >> mod;
        if(( a == 1 ) ||( a == 2 ) ) cout << 1 % mod;
        else
        {
            cout << pot_szybkie(( m % mod ), a ) % mod;
        }
    }
   
   
    return 0;
}
P-166441
1 2 3 4 « 5 » 6 7
Poprzednia strona Strona 5 z 7 Następna strona