MPI design about prime number and twin number (C++ and python)

MPI: message exchange in the processes

in this article, I just use MPI_SEND and MPI_RECV.

C++ version

#include<stdio.h>
#include <vector>
#include <iostream>
#include <algorithm>    
#include <iterator>     // ostream_iterator
#include "/usr/include/mpi/mpi.h"
const int MAX_NUMBERS = 100;
using namespace std;
int prime_number(int n)
{
    int i;
    
    if(n < 2 ) return 0;
    for(i = 2; i < n; i++)
    {
        if( n % i == 0)
        return 0;
    }
    return 1;
}


int find_min_prime(int number, int rank)
{
    int temp;
    int check_number;

    temp = int(number / 8);
    if( 8 * temp + 2 * rank + 1 <= number )
            temp = temp + 1; 
    while (1)
    {
        check_number = temp * 8 + 2 * rank + 1;
        if (prime_number(check_number))
            break;
        temp += 1 ;
    }
    return check_number;

}



int find_twin_number(int number, int rank)
{
    int n;

    while(1)
    {
        n = find_min_prime(number, rank);
        if( prime_number(n+2))
            return (n,n+2);
        else
            number += 1;
    }


}



vector<int> count_twin(int number, int rank)
{
    int bottom;
    int above;
    int n;

    bottom = rank;
    above = number;
    vector< int> list;
    int * twin = new int[100]();
    int i = 0;

    while(1)
    {
        n = find_min_prime(bottom,rank);
        if (n + 2 > above)
            break;
        if (prime_number(n+2))
            {
                    list.push_back(n);
            }
        bottom += 1;
    
    }

    std::vector<int>::iterator it;
    it = std::unique (list.begin(), list.end());   // 10 20 30 20 10 ?  ?  ?  ?
    list.resize( std::distance(list.begin(),it) ); // 10 20 30 20 10

    return list;
}
    



int main(int argc, char* argv[])
{
    int a ;
    int prime;
    int state = 0;
    int number_amount;
    vector<int> list;
    vector<int> un_list;
    vector< int> list_prime_number;
    vector< int> list_twin_number;
    int numprocs, myid, source;
    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &myid);
    MPI_Comm_size(MPI_COMM_WORLD, &numprocs);

    int number = 20;
    int message;
    if (myid == 4) 
    { 
        for(int i = 0; i<4; i++)
        { 
            MPI_Send(&number, 1, MPI_INT, i, 11,MPI_COMM_WORLD);
            cout<< "send " << number << " to processes "<< i <<" for problem 3"<< endl;
        }
        for(int i = 0; i<4; i++)
        {   
            MPI_Recv(&message, 1, MPI_INT, i, 12,MPI_COMM_WORLD,NULL);         
            list_prime_number.push_back(message);
            MPI_Recv(&message, 1, MPI_INT, i, 13,MPI_COMM_WORLD,NULL);
            list_twin_number.push_back(message);
        }
         int least_prime_number = *min_element(list_prime_number.begin(),list_prime_number.end());
         int least_twin_number = *min_element(list_twin_number.begin(),list_twin_number.end());
        cout<< "the least  prime number  is " << least_prime_number <<endl;
        cout<< "the least twin number  is (" << least_twin_number <<","<< least_twin_number +2<< ")" << endl;

        

    }

    else
    {
        MPI_Recv(&message, 1, MPI_INT, 4, 11,MPI_COMM_WORLD,NULL);
        int prime_number = find_min_prime(message,myid);
        int twin_number =  find_twin_number(message,myid);
        cout<< "the  prime number  is " << prime_number << "  at process  "<< myid<<" for problem 4 "<<endl;
        cout<< "the  twin number  is (" << twin_number <<","<< twin_number +2<< ")" << "  at process  "<< myid<<" for problem 4 "<<endl;
        MPI_Send(&prime_number, 1, MPI_INT, 4, 12,MPI_COMM_WORLD);
        MPI_Send(&twin_number, 1, MPI_INT, 4, 13,MPI_COMM_WORLD);
        list = count_twin(message,myid);

        MPI_Send(&list[0], list.size(), MPI_INT, 4, 14,MPI_COMM_WORLD);

        
    }

    vector<int> twin_list;
   

     if (myid == 4) 
     {  
        // MPI_Status status;

        for(int i = 0;i < 4;i++) 
            {        
                   vector<int> list2(MAX_NUMBERS);
                    MPI_Recv(&list2[0],  MAX_NUMBERS, MPI_INT, i, 14,MPI_COMM_WORLD,NULL);
                    for(int f = 0;f<list2.size();f++)
                   {    
                       if (list2[f] != 0)
                      {  
                        // cout<<list2[f] << "  get from process :"<< i <<endl;
                        twin_list.push_back(list2[f]);}
                    }
            }

   
        for (int i = 0;i < twin_list.size();i++)
            cout<<  twin_list[i]  <<" the twin list"<<endl;
        
        int length = twin_list.size();
        cout<<" the twin list counts number is :  "<<length <<endl;

     }

    MPI_Finalize();
    return 0;
}



python version

from mpi4py import MPI
import numpy as np
import argparse

comm = MPI.COMM_WORLD
rank = comm.Get_rank()
size = comm.Get_size()

parser = argparse.ArgumentParser()
parser.add_argument('--n', nargs='?', type=int, default=50,
                help='must be int')
arg = parser.parse_args()
n = arg.n



def prime_number(n):
    if n < 2 :
        return False
    for i in range(2,n):
        if n%i == 0:
            return False
    return True

def find_min_prime(number,rank):
    temp = number // 8 
    if 8 * temp + 2 * rank + 1 <= number :
        temp = temp + 1 
    while (1):
        check_number = temp * 8 + 2 * rank + 1
        # print(check_number)
        if prime_number(check_number):
            break
        temp += 1 
    return check_number


def find_twin_number(number, rank):
    while(1):
        n = find_min_prime(number, rank)
        if prime_number(n+2):
            return (n,n+2)
        else:
            number += 1


def count_twin(number, rank):
    bottom = int(rank)
    above = int(number)
    twin = []
    while(1):
        n = find_min_prime(bottom,rank)
        if n + 2 > above:
            break
        if prime_number(n+2):
            if (n,n+2) not in twin:
                twin.append ((n,n+2))
        bottom += 1
    return twin

            

if rank == 4:
    data = int(n) 
    for i in range(4):
        comm.isend(data, dest=i, tag=11)                           
        print("process {} immediate send {}...for problem 2".format(rank, data))
else:
#     for rank in range(4)
    data_count_twin =  count_twin(n,rank)
    data = comm.recv(source=4, tag=11)                         
    print("process {} recv {}...".format(rank, data)) 
    # data = data + 2 * rank +1 
    prime_number,twin_number = find_min_prime(data,rank),find_twin_number(data,rank)
    data = {'prime_number':prime_number,'twin_number':twin_number}
    comm.isend(data, dest=4, tag=12)
    print("process {} immediate send {}... for problem 4".format(rank, data))
  #  print('rank',rank, 'count', data_count_twin)
    comm.isend(data_count_twin, dest=4, tag=13)
    print("process {} immediate send {}... for problem 5".format(rank, data_count_twin))


data_twin = []
data_fin = []
if rank == 4:
    for i in range(4):
        temp = comm.recv(source = i, tag = 12)
        data_fin.append(temp)                           
        print("process {} immediate recv {}...".format(rank, temp))    


    least_min_twin = min([i['twin_number'][0] for i in data_fin])
    print('min_prime_number: ',min([i['prime_number'] for i in data_fin]), 'min_twin_number:  ',(least_min_twin,least_min_twin+2))

    for i in range(4):
        data_twin.extend(comm.recv(source = i, tag = 13))
    data_count = list(set(data_twin))
    print('the total number of twin numbers less than n: ',len(data_count))
    print(data_count)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末苟呐,一起剝皮案震驚了整個濱河市幽钢,隨后出現(xiàn)的幾起案子刺洒,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡晤柄,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進店門妖胀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來芥颈,“玉大人,你說我怎么就攤上這事赚抡∨揽樱” “怎么了?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵怕品,是天一觀的道長妇垢。 經(jīng)常有香客問我,道長肉康,這世上最難降的妖魔是什么闯估? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮吼和,結(jié)果婚禮上涨薪,老公的妹妹穿的比我還像新娘。我一直安慰自己炫乓,他們只是感情好刚夺,可當我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布献丑。 她就那樣靜靜地躺著,像睡著了一般侠姑。 火紅的嫁衣襯著肌膚如雪创橄。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天莽红,我揣著相機與錄音妥畏,去河邊找鬼。 笑死安吁,一個胖子當著我的面吹牛醉蚁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鬼店,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼网棍,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了妇智?” 一聲冷哼從身側(cè)響起滥玷,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎俘陷,沒想到半個月后罗捎,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡拉盾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了豁状。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捉偏。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖泻红,靈堂內(nèi)的尸體忽然破棺而出夭禽,到底是詐尸還是另有隱情,我是刑警寧澤谊路,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布讹躯,位于F島的核電站,受9級特大地震影響缠劝,放射性物質(zhì)發(fā)生泄漏潮梯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一惨恭、第九天 我趴在偏房一處隱蔽的房頂上張望秉馏。 院中可真熱鬧,春花似錦脱羡、人聲如沸萝究。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽帆竹。三九已至绕娘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間栽连,已是汗流浹背业舍。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留升酣,地道東北人舷暮。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像噩茄,于是被迫代替她去往敵國和親下面。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內(nèi)容