LINUX.ORG.RU

[Scheme][SICP]непонятки

 ,


0

0

глава 1.2.6, реализация малой теоремы ферма на схеме. ввиду остуствия собственного мозга, но желания разобраться загнал код в drScheme. он мне выдает в качестве результата некое #t. что это значит? О_о

★★★★★

> некое #t. что это значит?

Смею предположить, что это Ъ.

tarcar
()

вопрос снят: A #t or #T is the complete input syntax for the boolean constant true, and #f or #F is the complete input syntax for the boolean constant false.

и правда Ъ :)

stave ★★★★★
() автор топика

ну и подскажите еще, сломал голову, что я сделал неправильно вот в этом коде, пытаясь переложить на си?:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

unsigned int involution(int number, int power);
int random_less_number(int n);

int main(int argc, char** argv)
{
    int m, a, n;
    n = 331;
    a = random_less_number(n);
    m = (involution(a, (n-1)) - a) % n;
    printf("%d\n", m);
	return 0;
}

unsigned int involution(int number, int power){
    int i;
    unsigned int involution_number = number;
    for(i = 2; i <= power; ++i){
        involution_number = involution_number * number;
    }
    return involution_number;
}

int random_less_number(int n){
    int random_number;
    srandom(time(NULL));
    while (random_number >= n || random_number == 0){
        random_number = random() % 100;
    }
    return random_number;
}

stave ★★★★★
() автор топика
Ответ на: комментарий от stave

n - само число, a - любое целое число меньше n, m - результат, который должен быть равен 0, если есть число простое.

stave ★★★★★
() автор топика
Ответ на: комментарий от stave

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

unsigned int involution(int number, int power);
int random_less_number(int n);

int main(int argc, char** argv)
{
    int m, a, n;
    n = 331;
    a = random_less_number(n);
    m = (involution(a, (n-1)) - a) % n; // сфигли? 
      //(involution(a, (n-1)) - 1) % n 
      //должно было бы быть, но уже даже 2^330 вылезет за int докуя раз
    printf("%d\n", m);
	return 0;
}

unsigned int involution(int number, int power){
    int i;
    unsigned int involution_number = number;
    for(i = 2; i <= power; ++i){
        involution_number = involution_number * number;
    }
    return involution_number;
}

//умолчим, что никогда не вернет число 100 и больше и вообще криво.
int random_less_number(int n){
    int random_number;
    srandom(time(NULL));
    while (random_number >= n || random_number == 0){
        random_number = random() % 100;
    }
    return random_number;
}

Waterlaz ★★★★★
()
Ответ на: комментарий от stave

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

unsigned int involution(int number, int power, int m);
int random_less_number(int n);

int main(int argc, char** argv)
{
    int m, a, n;
    n = 331;
    a = random_less_number(n);
    m = involution(a, (n-1), n) - 1;
    printf("%d\n", m);
	return 0;
}

unsigned int involution(int number, int power, int m){
    //но так все равно никто степень не считает =)
    int i;
    unsigned int involution_number = 1;
    for(i = 1; i <= power; ++i){
        involution_number = (involution_number * number) %m;
    }
    return involution_number;
}

int random_less_number(int n){
    srandom(time(NULL));
    return (random() % (n-1)) +1;
}

Waterlaz ★★★★★
()
Ответ на: комментарий от Waterlaz

Спасибо. Надо же как-то хуиту побеждать )

stave ★★★★★
() автор топика
Ответ на: комментарий от stave

Все-таки в теории сравнений по модулю ориентироваться надо. Об этом и многом другом можно узнать в замечательной книге Дэвенпорта "Высшая арифметика".

balodja ★★★
()
Ответ на: комментарий от balodja

>Об этом и многом другом можно узнать в замечательной книге Дэвенпорта "Высшая арифметика".

Спасибо, скачал, буду читать.

stave ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.