forked from JohnCremona/eclib
-
Notifications
You must be signed in to change notification settings - Fork 0
/
ptest.cc
109 lines (95 loc) · 3.76 KB
/
ptest.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
// ptest.cc -- test program for arith functions
//////////////////////////////////////////////////////////////////////////
//
// Copyright 1990-2012 John Cremona
//
// This file is part of the eclib package.
//
// eclib is free software; you can redistribute it and/or modify it
// under the terms of the GNU General Public License as published by the
// Free Software Foundation; either version 2 of the License, or (at your
// option) any later version.
//
// eclib is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
// for more details.
//
// You should have received a copy of the GNU General Public License
// along with eclib; if not, write to the Free Software Foundation,
// Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
//
//////////////////////////////////////////////////////////////////////////
#include <eclib/arith.h>
#include <functional>
int main()
{
long n, p;
cout<<"Initialized table of " << nprimes() << " primes, up to "<<maxprime() << endl;
cout<<"Enter an index: "; cin >> n;
p=prime_number(n); cout << "prime_number("<<n<<") = "<<p<<endl;
cout<<"How many primes do you want to see (as a vector<long>)? "; cin >> n;
vector<long> plist=primes(n);
cout << plist << endl;
cout<<"Enter a number to see if it is that list: "; cin>>p;
vector<long>::iterator pi=find(plist.begin(),plist.end(),p);
if(pi==plist.end()) cout<<"NOT in the list"<<endl;
else cout<<p<<" is list item "<<(pi-plist.begin())<<" (counting from 0)"<<endl;
vector<long> v(10);
iota(v.begin(),v.end(),1);
cout<<"iota(10): "<<v<<endl;
n=2310*210*64*17;
cout<<"n = "<<n<<endl;
vector<long> exps;
transform(plist.begin(),plist.end(),inserter(exps,exps.end()),
bind2nd(ptr_fun(val),n));
cout<<"exps = "<<exps<<endl;
vector<long> plist1=primes(10);
cout<<"Comparing previous prime list with "<<plist1<<endl;;
cout<<"First starts with second, 10 items from 0: "<<startswith(plist,plist1,10)<<endl;
cout<<"First starts with second, 5 items from 5: "<<startswith(plist,plist1,5,5)<<endl;
cout<<"Second starts with first, 10 items from 0: "<<startswith(plist1,plist,10)<<endl;
cout<<"Second starts with first, 5 items from 5: "<<startswith(plist1,plist,5,5)<<endl;
//initialize a prime iterator for n primes
cout<<"How many primes do you want to see (one by one)? "; cin >> n;
for(primevar pr(n); pr.ok(); pr++)
cout << "Prime number " << pr.index() << " = " << pr << endl;
long m;
while (cout << "\nEnter an integer m (0 to stop): ", cin >> m, m!=0)
{
cout << "Smallest prime factor of " << m << " is " << primdiv(m) << endl;
plist=pdivs(m);
cout << "m has " << plist.size() << " prime divisors: " << plist << endl;
cout << "with exponents: ";
for(vector<long>::const_iterator pr = plist.begin(); pr!=plist.end(); pr++)
cout << *pr <<":"<<val(*pr,m) << "\t";
cout<<endl;
vector<long> dlist=alldivs(m,plist);
cout << "m has " << dlist.size() << " divisors: " << dlist << endl;
dlist = posdivs(m,plist);
cout << "m has " << dlist.size()
<< " positive divisors: " << dlist << endl;
dlist = sqdivs(m,plist);
cout << "m has " << dlist.size()
<< " positive divisors whose square divides m: " << dlist << endl;
dlist = sqfreedivs(m,plist);
cout << "m has " << dlist.size()
<< " positive square-free divisors: " << dlist << endl;
}
long a,b;
int cont=1;
while(cont)
{
cout<<"Enter integers a b (0 0 to stop): ";
cin>>a>>b;
long g=gcd(a,b);
if(g==0) cont=0;
else
{
cout<<"gcd = "<<g<<endl;
long l=lcm(a,b);
cout<<"lcm = "<<l<<endl;
}
}
cout << endl;
} /* main() */