

def      UpperCAmelCase__							(     _A :					Any      , _A :					List[str]      , _A :					Tuple				):





  '''simple docstring'''







  assert b != 0, "This cannot accept modulo that is == 0"
  if n == 0:
    return 1

  if n % 2 == 1:
    return (bin_exp_mod(_A      , n - 1      , _A				) * a) % b

  a__    =bin_exp_mod(_A      , n / 2      , _A				)
  return (r * r) % b


if __name__ == "__main__":
       try:
              lowerCamelCase 	=   int(input('''Enter Base : ''').strip())
              lowerCamelCase 	=   int(input('''Enter Power : ''').strip())
              lowerCamelCase 	=   int(input('''Enter Modulo : ''').strip())
       except ValueError:
              print('''Invalid literal for integer''')

       print(bin_exp_mod(BASE, POWER, MODULO))



import os
import sys
from pathlib import Path

import pytest

from datasets import Dataset, IterableDataset
from datasets.distributed import split_dataset_by_node

from .utils import execute_subprocess_async, get_torch_dist_unique_port, require_torch




def      UpperCAmelCase__							(     ):





  '''simple docstring'''







  a__    =Dataset.from_dict({'''i''': range(17				)}				)
  a__    =len(_A				)
  a__    =3
  a__    =[
      split_dataset_by_node(_A      , rank=_A      , world_size=_A				) for rank in range(_A				)
  ]
  assert sum(len(_A				) for ds in datasets_per_rank				) == full_size
  assert len({tuple(x.values()				) for ds in datasets_per_rank for x in ds}				) == full_size




def      UpperCAmelCase__							(     ):





  '''simple docstring'''







  def gen():
    return ({"i": i} for i in range(17				))

  a__    =3
  a__    =IterableDataset.from_generator(_A				)
  a__    =len(list(_A				)				)
  a__    =[
      split_dataset_by_node(_A      , rank=_A      , world_size=_A				) for rank in range(_A				)
  ]
  assert sum(len(list(_A				)				) for ds in datasets_per_rank				) == full_size
  assert len({tuple(x.values()				) for ds in datasets_per_rank for x in ds}				) == full_size




@pytest.mark.parametrize('''shards_per_node'''      , [1, 2, 3]				)
def      UpperCAmelCase__							(     _A :					Dict				):





  '''simple docstring'''







  def gen(_A :					List[str]				):
    for shard in shards:
      yield from ({"i": i, "shard": shard} for i in range(17				))

  a__    =3
  a__    =shards_per_node * world_size
  a__    ={'''shards''': [F"""shard_{shard_idx}.txt""" for shard_idx in range(_A				)]}
  a__    =IterableDataset.from_generator(_A      , gen_kwargs=_A				)
  a__    =len(list(_A				)				)
  assert full_ds.n_shards == world_size * shards_per_node
  a__    =[
      split_dataset_by_node(_A      , rank=_A      , world_size=_A				) for rank in range(_A				)
  ]
  assert [ds.n_shards for ds in datasets_per_rank] == [shards_per_node] * world_size
  assert sum(len(list(_A				)				) for ds in datasets_per_rank				) == full_size
  assert len({tuple(x.values()				) for ds in datasets_per_rank for x in ds}				) == full_size




def      UpperCAmelCase__							(     ):





  '''simple docstring'''







  def gen():
    return ({"i": i} for i in range(17				))

  a__    =2
  a__    =IterableDataset.from_generator(_A				)
  a__    =len(list(_A				)				)

  a__    =split_dataset_by_node(_A      , rank=0      , world_size=_A				).shuffle(seed=42				)
  assert len(list(_A				)				) == 1 + full_size // world_size
  with pytest.raises(_A				):
    split_dataset_by_node(_A      , rank=0      , world_size=_A				).shuffle()

  a__    =split_dataset_by_node(full_ds.shuffle(seed=42				)      , rank=0      , world_size=_A				)
  assert len(list(_A				)				) == 1 + full_size // world_size
  with pytest.raises(_A				):
    split_dataset_by_node(full_ds.shuffle()      , rank=0      , world_size=_A				)




@pytest.mark.parametrize('''streaming'''      , [False, True]				)
@require_torch
@pytest.mark.skipif(os.name == '''nt'''      , reason='''execute_subprocess_async doesn\'t support windows'''				)
@pytest.mark.integration
def      UpperCAmelCase__							(     _A :					Dict				):





  '''simple docstring'''







  a__    =2
  a__    =get_torch_dist_unique_port()
  a__    =Path(_A				).resolve().parent / '''distributed_scripts''' / '''launch_torch_distributed.py'''
  a__    =F"""
        -m torch.distributed.launch
        --nproc_per_node={nproc_per_node}
        --master_port={master_port}
        {test_script}
    """.split()
  a__    =F"""
        --streaming={streaming}
    """.split()
  a__    =[sys.executable] + distributed_args + args
  execute_subprocess_async(_A      , env=os.environ.copy()				)




@pytest.mark.parametrize(
    '''nproc_per_node, num_workers'''      , [
        (2, 2),  # each node has 2 shards and each worker has 1 shards
        (3, 2),  # each node uses all the shards but skips examples, and each worker has 2 shards
    ]      , )
@require_torch
@pytest.mark.skipif(os.name == '''nt'''      , reason='''execute_subprocess_async doesn\'t support windows'''				)
@pytest.mark.integration
def      UpperCAmelCase__							(     _A :					List[str]      , _A :					str				):





  '''simple docstring'''







  a__    =True
  a__    =get_torch_dist_unique_port()
  a__    =Path(_A				).resolve().parent / '''distributed_scripts''' / '''launch_torch_distributed.py'''
  a__    =F"""
        -m torch.distributed.launch
        --nproc_per_node={nproc_per_node}
        --master_port={master_port}
        {test_script}
    """.split()
  a__    =F"""
        --streaming={streaming}
        --num_workers={num_workers}
    """.split()
  a__    =[sys.executable] + distributed_args + args
  execute_subprocess_async(_A      , env=os.environ.copy()				)
