Archief - [PROG][EULER] Ontbinden in priemfactoren

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Mithrandix

Legacy Member
kmoet dus in euler ontbinden in priemfactoren maar snap er niets van :oink:

dit is wat ik al heb:

Code:
comment
Een getal ontbinden in priemfactoren
ontbindinpriem(a)
endcomment

function ontbindinpriem(a)

i=1;
v=[];
for i=1 to a;
	i=i+1;
	v=v_[i];
	c=a/i;
	d=floor(c);
	if (c==d)
		break;
	endif
end
		return v;
endfunction

bij ontbindinpriem(34) geeft em 2 :sop:

S3cT0r

Legacy Member
Ik heb iets in mijn snippets collectie gevonden dat een getal ontbind in zijn factoren (dat zijn dus allemaal priemgetallen), misschien help dat je.

HINT: De % of "modulus" operator verdeelt een getal en neemt de rest
Dus 5 % 2 = 1 (want de uitkomst is 4, rest is 1, dit kan je checken door een staartdeling uit te voeren).

Code:
#include <stdio.h>
#include <math.h>

unsigned long factor(unsigned long number,unsigned long *factors) {
    register unsigned int count = 2, root = (int)ceil(sqrt((double)number));

	while (count <= root) {
		if (number % count) ++count;
		else {
			*factors++ = count;
			number /= count;
		}
	}

	*factors = 1000;

	return(number);
}

int main() {
    register unsigned long number, factors[100], rest;
    register unsigned int cnt = 0;
    
    /*
    for (cnt = 0; cnt < 100; ++cnt) {
        rest = factor((long)cnt,factors);
        if (cnt == rest) {
            printf("%d is a prime\n",cnt);
        }
    }
    */
    
    puts("Enter your number:");
    scanf("%lu",&number);

    rest = factor(number,factors);
    
    printf("%lu",rest);
    while (factors[cnt] != 1000) {
        printf("*%lu",factors[cnt++]);
    }
    printf(" = %lu",number);

    getchar();
    getchar();
    return(0);
}

Yngwie

Legacy Member
1TI aant rega in leuven zeker, ik zit er ook mee mr ben voor de moment te moe om er helder over na te denken, morgenvroeg zal ik wel een oplossing hebben denk ik

zoutvat

Legacy Member
In Oberon even snel geprogrammeerd:

Code:
MODULE Priem;

IMPORT
	In,OutExt;

	VAR
		priem : ARRAY 20 OF INTEGER;
		
	PROCEDURE GeefPriemfact*;
	
		VAR
			a,i:INTEGER;
			priemfactorgevonden :BOOLEAN;
	
	BEGIN
		In.Open;
		In.Int(a);
		
		WHILE a > 1 DO
			i := 0;
			priemfactorgevonden := FALSE;
			
			WHILE ~priemfactorgevonden DO		
				IF (a MOD priem[i] = 0) THEN
					OutExt.Int(priem[i],0);
					OutExt.String(" ");
					a := a DIV priem[i];
					i := 0;
					priemfactorgevonden := TRUE;
				END;
				INC(i);
			END;			
		END;
	END GeefPriemfact;
	
BEGIN
	priem[0]:=2;
	priem[1]:=3;
	priem[2]:=5;
	priem[3]:=7;
	priem[4]:=11;
	priem[5]:=13;
END Priem.

UIteraard moet je priemarray wel wat uitgebreider.

killgore

Legacy Member
Als ik u een tip mag geven, als je algoritmes zoekt voor iets: begin bij wikipedia.

De uitleg is daar niet altijd perfect, maar je kan je al een deftig beeld vormen van welke algoritmes er beschikbaar zijn en daarmee verder zoeken op gespecialiseerde sites. Als je trouwens engelse term niet weet: naar nl wikipedia pagina gaan en dan daar vanonder links ergens op english drukken helpt ook.

Dan zou je dus na even prutsen op deze pagina uitkomen, misschien dat deze je al iets verder helpt ;): http://en.wikipedia.org/wiki/Integer_factorization#General-purpose

edit: merk wel op dat je ontbinden in priemfactoren nooit echt aan een gigantisch tempo zal kunnen doen, zelfs niet met de beste algoritmes beschikbaar (is oa beetje hetgene waar RSA-encryptie rond draait :p).

zoutvat

Legacy Member
merk op dat mijn algoritme gebruikt maakt van een voorgemaakt array met priemgetallen. dit zou in principe ook anders moeten kunnen. ik begin er nu aan. de oplossing volgt strakjes.

Edit:
Code:
	PROCEDURE GeefPriemfactor*;
	
		VAR
			a,i:INTEGER;
			priemfactorgevonden :BOOLEAN;
	
	BEGIN
		In.Open;
		In.Int(a);
		
		WHILE a > 1 DO
			i := 1;
			priemfactorgevonden := FALSE;		
			WHILE ~priemfactorgevonden DO		
				INC(i);
				IF (a MOD i  = 0) THEN
					OutExt.Int(i,0);
					OutExt.String(" ");
					a := a DIV i;
					i := 0;
					priemfactorgevonden := TRUE;
				END;
			END;			
		END;
	END GeefPriemfactor;

Eigenlijk zo je in staat moeten zijn dit zelf te vinden. Zo'n moeilijke opgave is dit niet.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan